图像滤波和图像混合 Image Filtering and Hybrid Images
项目要求
- 通过滤波分离图像的高频和低频。
- 将不同图像的高频和低频合并以创建相关尺度的图像。
项目原理
-
图像的频率:
频率是灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。图像中的低频信号和高频信号也叫做低频分量和高频分量。
-
低频:
低频就是颜色缓慢地变化,也就是灰度缓慢地变化,就代表着那是连续渐变的一块区域,这部分就是低频。 对于一幅图像来说,除去高频的就是低频了,也就是边缘以内的内容为低频,而边缘内的内容就是图像的大部分信息,即图像的大致概貌和轮廓,是图像的近似信息。所以说低频分量主要对整幅图像的强度的综合度量。
-
高频:
反过来,高频就是频率变化快。当相邻区域之间灰度相差很大,这就是变化得快。图像中,一个影像与背景的边缘部位,通常会有明显的差别,也就是说变化那条边线那里,灰度变化很快,也即是变化频率高的部位。因此,图像边缘的灰度值变化快,就对应着频率高,即高频显示图像边缘。图像的细节处也是属于灰度值急剧变化的区域,正是因为灰度值的急剧变化,才会出现细节。所以说高频分量主要是对图像边缘和轮廓的度量。
另外噪声(即噪点)也是这样,当一个像素所在的位置与正常的点颜色不一样(该像素点灰度值明显不一样,也就是灰度有快速地变化)时可视为噪声。
主要函数
my_imfilter()
函数解释
my_imfilter函数目的是实现类似于scipy.ndimage.filters.correlate函数的功能。在对于彩色图像(即三通道RGB图像)进行处理时,应该分别对每一个通道分别进行滤波处理。
输入参数
- 待处理图像(255 * 255 * 3)
- 滤波器(3 * 3)
输出参数
滤波处理后的图像(255 * 255 * 3)
主要实现步骤
-
通过numpy的shape函数得图像和滤波器的尺寸(长和宽)
im_dim=image.shape flt_dim=imfilter.shape img_dim1=im_dim[0] img_dim2=im_dim[1] flt_dim1=flt_dim[0] flt_dim2=flt_dim[1]
- 为了避免因为卷积运算导致输出图像缩小和图像边缘信息丢失,常常采用图像边缘填充技术,即在图像四周边缘填充0,使得卷积运算后图像大小不会缩小,同时也不会丢失边缘和角落的信息。其中,长度和宽度的增加量取决于过滤器的大小
pad_dim1=int((flt_dim1-1)/2) pad_dim2=int((flt_dim2-1)/2)
- 使用numpy的zero函数初始化填充数组为0
pad_mat=np.zeros((img_dim1+2*pad_dim1,img_dim2+2*pad_dim2,3))
- 把填充数组和原始图像相整合
pad_mat[pad_dim1: img_dim1 + pad_dim1, pad_dim2: img_dim2 + pad_dim2] = image
- 进行卷积操作,过滤器从图像的最左上角像素移动到最右下角像素。
for d in range(len(image[0][0])): for i in range(len(image)): for j in range(len(image[0])): output[i][j][d] = sum(sum(np.multiply(imfilter,pad_mat[i:i+flt_dim1,j:j+flt_dim2,d])))
gen_hybrid_image()
函数解释
使用滤波器得到第一张图像的低通滤波和第二张图像的高通滤波,并加以混合
输入参数
- 图一,提供低通滤波
- 图二,提供高通滤波
- 高斯模糊函数的标准差
输出参数
- 通过图一得到的低通滤波图
- 通过图二得到的高通滤波图
- 图一得到的低通滤波和图二得到的高通滤波的混合图
主要实现步骤
- 设置高斯模糊过滤器,高斯模糊在各个方向上具有普适性
gaussian_filter = gauss2D(shape=(cutoff_frequency*4+1,cutoff_frequency*4+1), sigma = cutoff_frequency)
- 使图一通过高斯模糊滤波器以去除高频信号,从而得到图一的低通滤波图
low_frequencies = my_imfilter(image1, gaussian_filter) # Remove the high frequencies from image1 by blurring it
- 使图二通过高斯模糊滤波器以去除高频信号,从而得到图二的低通滤波图,再拿图二的原始图与该图做减法,就得到图二的高通滤波图
high_frequencies = image2 - my_imfilter(image2, gaussian_filter) # Remove the low frequencies from image2
将图一的低通滤波图和图二的高通滤波图进行相加得到最终的混合图
hybrid_image = low_frequencies+high_frequencies # Combine
return low_frequencies,high_frequencies,hybrid_image
实验步骤
- 读取图片路径,并对图像进行预处理操作
- 将预处理后的图像进行滤波操作和融合操作
- 按照项目要求进行输出图像的保存操作
if __name__ == "__main__":
image1,image2,main_path=setup_image(img1_name,img2_name)
low_frequencies,high_frequencies,hybrid_image=gen_hybrid_image(image1, image2, cutoff_frequency)
save_image(main_path,low_frequencies,high_frequencies,hybrid_image,img1_name,img2_name)
结果展示
数据预览
参考文献
Project 1: Image Filtering and Hybrid Images
CS 143: Introduction to Computer Vision