3频率域滤波
频率域滤波与空间滤波是对图像增强一个问题的两种殊途同归的方式[8].在分析图像信号的频率特性时,对于一幅图像,直流分量表示预想的平均灰度,低频分量代表了大面积背景区域和缓慢变化部分,高频部分代表了它的边缘、细节、跳跃部分以及颗粒噪声。截取频率的低频分量,对其作傅立叶反变换,得到的就是模糊后的图像; 截取频率的高频分量,对其作傅立叶反变换,得到的就是锐化后的图像[9].opencv包中DFT(Discrete Fourier Transform) 和IDFT(inverse DFT) 算法用于傅立叶变换。本次研究中同时利用了numpy包中fft.fftshift傅立叶变换函数[10],Python代码如下,其结果如图3.
img = cv2.imread(‘myson.jpg',0)
rows,cols = img.shapecrow,ccol = rows / 2,cols / 2 #取中心#
mask1 = np.zeros( (rows,cols,2) ,np.uint8)#建立一个遮罩中心都是1,边缘都是0#
mask1[crow-30:crow+30,ccol-30:ccol+30]= 1
mask2 = np.ones( (rows,cols,2) ,np.uint8)#建立一个遮罩中心都是0,边缘都是1#
mask2[crow-30:crow+30,ccol-30:ccol+30]= 0
dft = cv2.dft(np.float32(img) ,flags = cv2.DFT_COMPLEX_OUTPUT)# #傅立叶变换,输入图像转成np.float32型频谱#
dft_shift = np.fft.fftshift(dft)#反换位,低频部分移到四周,高频部分移到中间#
magnitude_spectrum = 20* np.log(cv2.magnitude(dft_shift[: ,: ,0],dft_shift[: ,: ,1]) )
fshift1 = dft_shift* mask1 #对遮罩和频谱进行IDFT#
fshift2 = dft_shift* mask2
f_ishift1 = np.fft.ifftshift(fshift1)#做数据反转#
f_ishift2 = np.fft.ifftshift(fshift2)
img_back1 = cv2.idft(f_ishift1)
img_back1 = cv2.magnitude(img_back1[: ,: ,0],img_back1[: ,: ,1])#将频谱转换为可视图像#
img_back2 = cv2.idft(f_ishift2)
img_back2 = cv2.magnitude(img_back2[: ,: ,0],img_back2[: ,: ,1])
4边缘检测
边缘检测是图像处理和计算机视觉中的基本问题,目的是标识数字图像中亮度变化明显的点,解决图像分割的问题[11].常见的算法包括: 差分边缘检测、梯度边缘检测、ROBERT边缘检测[12]. opencv包中有Canny算法、Sobel算法、Laplace算法,Scharr滤波器以及Hough直线检测可以完成相应的边缘检测。本次实验中笔者利用sobel和Canny边缘两种方法,并借助高斯模糊解决图像边缘检测问题[13].代码如下,其结果如图4.
img = cv2.imread(“ myson.jpg”,0)
img = cv2.Gaussian Blur(img,(3,3) ,0)#用高斯平滑处理原图像降噪#
x = cv2.Sobel(img,cv2.CV_16S,1,0)#X轴sobel边缘检测#
y = cv2.Sobel(img,cv2.CV_16S,0,1)#y轴sobel边缘检测#
abs X = cv2.convert Scale Abs(x)#转回uint8,否则将无法显示图像#
abs Y = cv2.convert Scale Abs(y)
dst = cv2.add Weighted(abs X,0.5,abs Y,0.5,0)#sobel边缘检测#
canny = cv2.Canny(img,50,150)#Canny边缘检测#