CS445 Project1 Hybrid_Image

使用 Jupyter Notebook

Part I: Hybrid Images混合图像

混合图像是静态图像,其解释随观看距离的变化而变化。基本思想是,当高频可用时,高频往往会主导感知,但在远处,只能看到信号的低频部分。 在远处,只能看到信号的低频(平滑)部分。
因此,将一张图像的低频部分和另一张图像的高频部分混合得到的图像,在近处和远处看到的结果会不同。

因此实验原理很简单:使用高斯滤波器对图像进行卷积操作,对于低通图像可直接保留低频部分,对于高通图像,将原始图像减去低通滤波后的版本即可得到高通部分。

部分代码:
选择好两张需要融合的图像,确定哪张进行高通哪张进行低通。导入,然后转换成灰度图
其中 ‘im1_file/path’‘im2_file/path’ 需要替换成你自己的图像路径

#im1进行高通,im2进行低通
im1_file = 'im1_file/path'
im2_file = 'im2_file_path'

im1 = cv2.imread(im1_file,cv2.IMREAD_GRAYSCALE)
im2 = cv2.imread(im2_file,cv2.IMREAD_GRAYSCALE)

接下来使用一个交互函数,在原始代码utils里提供的,需要鼠标分别点出两张图像对应的点,如下:

pts_im1 = utils.prompt_eye_selection(im1)
pts_im2 = utils.prompt_eye_selection(im2)

im1, im2= utils.align_images(im1_file, im2_file,pts_im1,pts_im2,save_images=False)

然后也是使用utils里的函数使其自动对齐。实质是根据提供的坐标旋转第一张图,使其与第二张图对齐。

在这里插入图片描述在这里插入图片描述

图像融合

设置截止频率,调用如下函数即可实现图像融合

def hybrid_images(im1, im2, cutoff_low, cutoff_high):   
    high_passed = im1 - signal.convolve2d(im1, utils.gaussian_kernel(cutoff_high,3*cutoff_high),boundary='symm', mode='same')
    low_passed = signal.convolve2d(im2, utils.gaussian_kernel(cutoff_low,3*cutoff_low),boundary='symm', mode='same')
    
    #高通图像和低通图像
    fig, axes = plt.subplots(1, 2)
    axes[0].imshow(high_passed,cmap='gray')
    axes[0].set_title('dog High passed'), axes[0].set_xticks([]), axes[0].set_yticks([])
    axes[1].imshow(low_passed,cmap='gray')
    axes[1].set_title('dune Low passed'), axes[1].set_xticks([]), axes[1].set_yticks([])
    plt.savefig('high_low_pass.png')
    #高通、低通图像的FFT 
    fft_high = np.log(np.abs(np.fft.fftshift(np.fft.fft2(high_passed))))
    fft_low = np.log(np.abs(np.fft.fftshift(np.fft.fft2(low_passed))))
    
    fig, axes = plt.subplots(1, 2)
    axes[0].imshow(fft_high)
    axes[0].set_title('FFT High passed'), axes[0].set_xticks([]), axes[0].set_yticks([])
    axes[1].imshow(fft_low)
    axes[1].set_title('FFT Low passed'), axes[1].set_xticks([]), axes[1].set_yticks([])
       
    return  high_passed+low_passed
 
cutoff_high = 3
cutoff_low = 5

hybrid_im = hybrid_images(im1,im2,cutoff_low,cutoff_high)

结果如下:近看是小猪佩奇,远看是个吹风机。
在这里插入图片描述

FFT图

#FFT
fft_high = np.log(np.abs(np.fft.fftshift(np.fft.fft2(im1))))
fft_low = np.log(np.abs(np.fft.fftshift(np.fft.fft2(im2))))

#显示频谱图
fig, axes = plt.subplots(1, 2)
axes[0].imshow(fft_high)
axes[0].set_title('im1 FFT'), axes[0].set_xticks([]), axes[0].set_yticks([])
axes[1].imshow(fft_low)
axes[1].set_title('im2 FFT'), axes[1].set_xticks([]), axes[1].set_yticks([])

可得到类似下图的结果
在这里插入图片描述

完整代码在这里
修改路径后可以直接用

#!/usr/bin/env python
# coding: utf-8

## Part I : Hybrid Images
# In[1]:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LogNorm
from scipy import signal
from numpy.fft import fft2,fftshift
import utils

# In[2]:

get_ipython().run_line_magic('matplotlib', 'notebook')


# In[3]:
#im1进行高通,im2进行低通
im1_file = 'im1_file/path'
im2_file = 'im2_file/path'

im1 = cv2.imread(im1_file,cv2.IMREAD_GRAYSCALE)
im2 = cv2.imread(im2_file,cv2.IMREAD_GRAYSCALE)


# In[4]:
cv2.imshow('im1',im1)
cv2.imshow('im2',im2)

cv2.waitKey(0)
cv2.destroyAllWindows()

# In[5]:
pts_im1 = utils.prompt_eye_selection(im1)
# In[6]:
pts_im2 = utils.prompt_eye_selection(im2)

# In[7]:
im1, im2= utils.align_images(im1_file, im2_file,pts_im1,pts_im2,save_images=False)

# In[8]:

#转为灰度图
im1 = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY) /255.0
im2 = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY) /255.0

# In[9]:

#显示原图
fig, axes = plt.subplots(1, 2)
axes[0].imshow(im1,cmap='gray')
axes[0].set_title('im1'), axes[0].set_xticks([]), axes[0].set_yticks([])
axes[1].imshow(im2,cmap='gray')
axes[1].set_title('im2'), axes[1].set_xticks([]), axes[1].set_yticks([])
plt.savefig('original_images.png')
#FFT
fft_high = np.log(np.abs(np.fft.fftshift(np.fft.fft2(im1))))
fft_low = np.log(np.abs(np.fft.fftshift(np.fft.fft2(im2))))

#显示频谱图
fig, axes = plt.subplots(1, 2)
axes[0].imshow(fft_high)
axes[0].set_title('im1 FFT'), axes[0].set_xticks([]), axes[0].set_yticks([])
axes[1].imshow(fft_low)
axes[1].set_title('im2 FFT'), axes[1].set_xticks([]), axes[1].set_yticks([])
plt.savefig('original_images_FFT.png')

# In[10]:
import matplotlib

def hybrid_images(im1, im2, cutoff_low, cutoff_high):   
    high_passed = im1 - signal.convolve2d(im1, utils.gaussian_kernel(cutoff_high,3*cutoff_high),boundary='symm', mode='same')
    low_passed = signal.convolve2d(im2, utils.gaussian_kernel(cutoff_low,3*cutoff_low),boundary='symm', mode='same')
    
    #高通图像和低通图像
    fig, axes = plt.subplots(1, 2)
    axes[0].imshow(high_passed,cmap='gray')
    axes[0].set_title('dog High passed'), axes[0].set_xticks([]), axes[0].set_yticks([])
    axes[1].imshow(low_passed,cmap='gray')
    axes[1].set_title('dune Low passed'), axes[1].set_xticks([]), axes[1].set_yticks([])
    plt.savefig('high_low_pass.png')
    #高通、低通图像的FFT 
    fft_high = np.log(np.abs(np.fft.fftshift(np.fft.fft2(high_passed))))
    fft_low = np.log(np.abs(np.fft.fftshift(np.fft.fft2(low_passed))))
    
    fig, axes = plt.subplots(1, 2)
    axes[0].imshow(fft_high)
    axes[0].set_title('FFT High passed'), axes[0].set_xticks([]), axes[0].set_yticks([])
    axes[1].imshow(fft_low)
    axes[1].set_title('FFT Low passed'), axes[1].set_xticks([]), axes[1].set_yticks([])
       
    return  high_passed+low_passed

# In[11]:

cutoff_high = 4
cutoff_low = 8

hybrid_im = hybrid_images(im1,im2,cutoff_low,cutoff_high)

# In[13]:

cropped_object = utils.interactive_crop(hybrid_im)

# In[14]:
get_ipython().run_line_magic('matplotlib', 'notebook')

#显示混合图像的FFT
fig, ax = plt.subplots(1, 1)
ax.imshow(hybrid_im,cmap='gray')
ax.set_title('Hybrid Image FFT')
ax.set_xticks([])
ax.set_yticks([])

fft = np.log(np.abs(np.fft.fftshift(np.fft.fft2(hybrid_im))))
ax.imshow(fft)
plt.savefig('hybrid_FFT.png')

Part II: Image Enhancement图像增强

对比增强

import cv2

im1 = cv2.imread('im1/path',0)

enh_im1 = cv2.equalizeHist(im1)

im1 = cv2.cvtColor(im1, cv2.COLOR_BGR2RGB)
enh_im1 = cv2.cvtColor(enh_im1, cv2.COLOR_BGR2RGB)

fig, axes = plt.subplots(1, 2)
axes[0].imshow(im1)
axes[0].set_title('Original Image'), axes[0].set_xticks([]), axes[0].set_yticks([])
axes[1].imshow(enh_im1)
axes[1].set_title('Contrast Image'), axes[1].set_xticks([]), axes[1].set_yticks([])

plt.savefig('Contrast_enhancement.png')

色彩增强

import cv2
import numpy as np

im1 = cv2.imread('im1/path')

# 将图像转换为hsv颜色空间
im1_hsv = cv2.cvtColor(im1,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(im1_hsv)

im1_hsv = cv2.merge((h,s*2,v))  
im1_hsv = np.clip(im1_hsv, 0, 255) 
im1_hsv = cv2.cvtColor(im1_hsv.astype(np.uint8), cv2.COLOR_HSV2RGB)  

im1 = cv2.cvtColor(im1, cv2.COLOR_BGR2RGB)

fig, axes = plt.subplots(1, 2)
axes[0].imshow(im1)
axes[0].set_title('Original im1'), axes[0].set_xticks([]), axes[0].set_yticks([])
axes[1].imshow(im1_hsv)
axes[1].set_title('Increased Saturation im1'), axes[1].set_xticks([]), axes[1].set_yticks([])
plt.savefig('Color_enhancement.png')

颜色偏移

import cv2
import numpy as np

im1 = cv2.imread('im1/path')
im1_lab = cv2.cvtColor(im1,cv2.COLOR_BGR2LAB)

#更红 
im1_red = np.array(im1_lab).astype(np.float32)+20
im1_red[np.where(im1_red > 255)] = 255
im1_red = im1_red.astype(np.uint8)

#较少的黄色
im1_yellow = np.array(im1_lab).astype(np.float32)
im1_yellow[:,:,2] -= 30
im1_yellow[np.where(im1_yellow < 0)] = 0
im1_yellow = im1_yellow.astype(np.uint8)

#转回RGB
im1 = cv2.cvtColor(im1,cv2.COLOR_BGR2RGB)
im1_red = cv2.cvtColor(im1_red,cv2.COLOR_LAB2RGB)
im1_yellow = cv2.cvtColor(im1_yellow,cv2.COLOR_LAB2RGB)

fig, axes = plt.subplots(1, 2)
axes[0].imshow(im1)
axes[0].set_title('Original im1'), axes[0].set_xticks([]), axes[0].set_yticks([])
axes[1].imshow(im1_red)
axes[1].set_title('more_red_im1'), axes[1].set_xticks([]), axes[1].set_yticks([])
plt.savefig('more_red.png')

fig, axes = plt.subplots(1, 2)
axes[0].imshow(im1)
axes[0].set_title('Original im1'), axes[0].set_xticks([]), axes[0].set_yticks([])
axes[1].imshow(im1_yellow)
axes[1].set_title('less_yellow_im1'), axes[1].set_xticks([]), axes[1].set_yticks([])
plt.savefig('less_yellow.png')
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值