Image Filtering and Hybrid Images
学号:23020201153794
系别:计算机科学系
课程名称:计算机视觉
一、实验分析
1.问题描述
本实验要求实现一个图像滤波函数,对于给定的两幅图像,得到第一幅图像的高频信息,即细节信息;得到另外一幅图像的低频信息,即大概轮廓信息;然后进行混合得到混合图像,从远处与近处分别看混合后的图像会看到不同的效果(实验提供了5对对齐的图像)。
2.实验数据分析
数据集一共提供了10张图片,每两张图片进行得到一幅HybridImage, 根据观察,实验给出的需要融合的两张图片具有如下性质:尺寸长宽相同;图像中的目标基本相似,比如鸟与飞机;图像均为 彩色图像,即为RGB图像。
他们的对应关系如下:
225*265:
marilyn
einstein
410*361:
cat
dog
375*331:
bird
plane
453*300:
bicycle
motorcycle
375*307
fish
submarine
二、实验原理
本次作业的原理来源于由Oliva、Torralba和 Schyns 在2006年发明并在SIGGRAPH上发表了的论文 Hybrid images。该论文提出混合图像是基于人类视觉系统对图像的多尺度处理,由视觉掩蔽研究驱动的。这些图像可用于创建引人注目的显示,其中图像在不同的距离有不同的感知。通过滤波分离图像的高频和低频,将不同图像的高频和低频合并以创建相关尺度的图像。
1.图像的频率:
频率是灰度值变化剧烈程度的指标,是灰度在平面空间上的梯度。
图像中的低频信号和高频信号也叫做低频分量和高频分量。
2.低频:
低频就是颜色缓慢地变化,也就是灰度缓慢地变化,就代表着那是连续渐变的一块区域,这部分就是低频。 对于一幅图像来说,除去高频的就是低频了,也就是边缘以内的内容为低频,而边缘内的内容就是图像的大部分信息,即图像的大致概貌和轮廓,是图像的近似信息。
所以说低频分量主要对整幅图像的强度的综合度量。
3.高频:
反过来,高频就是频率变化快。当相邻区域之间灰度相差很大,这就是变化得快。图像中,一个影像与背景的边缘部位,通常会有明显的差别,也就是说变化那条边线那里,灰度变化很快,也即是变化频率高的部位。因此,图像边缘的灰度值变化快,就对应着频率高,即高频显示图像边缘。图像的细节处也是属于灰度值急剧变化的区域,正是因为灰度值的急剧变化,才会出现细节。
所以说高频分量主要是对图像边缘和轮廓的度量。
另外噪声(即噪点)也是这样,当一个像素所在的位置与正常的点颜色不一样(该像素点灰度值明显不一样,也就是灰度有快速地变化)时可视为噪声。
三、实验内容
1.算法流程
如图, 对于需要融合的两幅图像,我们先进行图像对齐操作,对齐之后的两幅图像大小一样,而且目标也相应的进行了对齐。接着再用对齐之后的图像分别得到高频信息,与低频信息,最后进行高频信息与低频信息的融合得到HybridImage。
由于给定的数据集对应图片大小一致,故可以不进行对齐。
(1). 提取图像低频信息
实验中采用将图像进行高斯滤波,即可得到图像的低频信息,这里需要调节的是高斯滤波的方差,方差越大,图像就会趋于模糊,需要找到一个合适的方差使之与另外一幅图像的高频信息进行融合后可以得到效果更好的融合图像。
(2). 提取图像高频信息
实验中对于图像的高频信息的提取采取的是先用高斯滤波得到图像的低频信息,接着用原图像减去该低频信息就可以得到图像的高频信息。
(3). 高频与低频信息融合
实验中对于高频信息与低频信息的融合就是直接将高频信息与低频信息进行相加,就可以得到最后的融合图像HybridImage。
2.实验代码
实验在pycharm2020上进行,无需进行对其操作。
import numpy
from numpy.fft import fft2, ifft2, fftshift, ifftshift
from scipy import misc
from scipy import ndimage
import math
def scaleSpectrum(A):
return numpy.real(numpy.log10(numpy.absolute(A) + numpy.ones(A.shape)))
# sample values from a spherical gaussian function from the center of the image
def makeGaussianFilter(numRows, numCols, sigma, highPass=True):
centerI = int(numRows/2) + 1 if numRows % 2 == 1 else int(numRows/2)
centerJ = int(numCols/2) + 1 if numCols % 2 == 1 else int(numCols/2)
def gaussian(i,j):
coefficient = math.exp(-1.0 * ((i - centerI)**2 + (j - centerJ)**2) / (2 * sigma**2))
return 1 - coefficient if highPass else coefficient
return numpy.array([[gaussian(i,j) for j in range(numCols)] for i in range(numRows)])
def filterDFT(imageMatrix, filterMatrix):
shiftedDFT = fftshift(fft2(imageMatrix))
misc.imsave("dft.png", scaleSpectrum(shiftedDFT))
filteredDFT = shiftedDFT * filterMatrix
misc.imsave("filtered-dft.png", scaleSpectrum(filteredDFT))
return ifft2(ifftshift(filteredDFT))
def lowPass(imageMatrix, sigma):
n,m = imageMatrix.shape
return filterDFT(imageMatrix, makeGaussianFilter(n, m, sigma, highPass=False))
def highPass(imageMatrix, sigma):
n,m = imageMatrix.shape
return filterDFT(imageMatrix, makeGaussianFilter(n, m, sigma, highPass=True))
def hybridImage(highFreqImg, lowFreqImg, sigmaHigh, sigmaLow):
highPassed = highPass(highFreqImg, sigmaHigh)
lowPassed = lowPass(lowFreqImg, sigmaLow)
return highPassed + lowPassed
def playWithFiltering():
marilyn = ndimage.imread("marilyn.png", flatten=True)
highPassedMarilyn = highPass(marilyn, 20)
lowPassedMarilyn = lowPass(marilyn, 20)
misc.imsave("low-passed-marilyn.png", numpy.real(lowPassedMarilyn))
misc.imsave("high-passed-marilyn.png", numpy.real(highPassedMarilyn))
misc.imsave("sum-of-marilyns.png", numpy.real((highPassedMarilyn + lowPassedMarilyn)/2.0))
if __name__ == "__main__":
# marilyn 225*265
# einstein 225*265
# cat 410*361
# dog 410*361
# bird 375*331
# plane 375*331
# bicycle 453*300
# motorcycle 453*300
# fish 375*307
# submarine 375*307
#输入图片的路径和文件名
source_path='data_sets/'
highFreqImg ='hcy.jpg'
lowFreqImg ='yxx.png'
#读取图片
einstein = ndimage.imread(source_path+highFreqImg, flatten=True)
marilyn = ndimage.imread(source_path+lowFreqImg, flatten=True)
#保存的混合图片路径和文件名
result_name=highFreqImg.split('.')[0]+'-'+lowFreqImg.split('.')[0]+'.png'
result_path='result/'
#混合图像
hybrid = hybridImage(einstein, marilyn, 25, 10)
#保存结果
misc.imsave(result_path+result_name, numpy.real(hybrid))
3.实验结果: