一、直方图与傅里叶变换
1、直方图
算法实现
importcv2frommatplotlibimportpyplotaspltimg=cv2.imread('cat.jpg')color=('b','g','r')fori,colinenumerate(color): hist=cv2.calcHist([img],[0],None,[256],[0,256]) plt.plot(hist,color=col) plt.xlim([0,256]) plt.imshow(hist) plt.show()print(hist.shape)
2、图像均衡(要转换为灰度图像才能均衡化)
直方图均衡化算法原理
算法实现
importcv2frommatplotlibimportpyplotaspltimg=cv2.imread('cat.jpg',0)plt.hist(img.ravel(),256) #ravel(把多维数组转化为一维数组)plt.show()equ=cv2.equalizeHist(img)plt.hist(equ.ravel(),256) plt.show()
自适应均衡化:分块实现均衡化
算法实现
clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))res_clahe=clahe.apply(img)
、傅里叶变换
傅里叶变换的作用:高频:变化剧烈的灰度分量。例如边界。
低频:变化缓慢的灰度分量,例如大海。
低通滤波器:只保留低频,会使得图像模糊
高通滤波器:只保留高频,会使得图像细节增强
importcv2frommatplotlibimportpyplotaspltimportnumpyasnpimg=cv2.imread('lena.jpg',0) img_float32=np.float32(img) dft=cv2.dft(img_float32,flags=cv2.DFT_COMPLEX_OUTPUT) dft_shift=np.fft.fftshift(dft) #把低频的移到中间#得到灰度图能表现的形式magnitude_spectrum=20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1])) plt.subplot(121),plt.imshow(img,cmap='gray') plt.title('Input Image'),plt.xticks([]),plt.yticks([]) plt.subplot(122),plt.imshow(magnitude_spectrum,cmap='gray') plt.title('magni'),plt.xticks([]),plt.yticks([]) plt.show()
高通滤波代码实现
img_float32=np.float32(img) dft=cv2.dft(img_float32,flags=cv2.DFT_COMPLEX_OUTPUT) dft_shift=np.fft.fftshift(dft) #把低频的移到中间rows,cols=img.shapecrow,ccol=int(rows/2),int(cols/2) #中心位置#高通滤波mask=np.ones((rows,cols,2),np.uint8) mask[crow-50:crow+50,ccol-50,ccol+50]=0#这行代码有点问题#idftfshift=dft_shift*maskf_ishift=np.fft.fftshift(fshift) img_back=cv2.idft(f_ishift) img_back=cv2.magnitude(img_back[:,:,0],img_back[:,:,1]) #得到灰度图能表现的形式plt.subplot(121),plt.imshow(img,cmap='gray') plt.title('Input Image'),plt.xticks([]),plt.yticks([]) plt.subplot(122),plt.imshow(img_back,cmap='gray') plt.title('result'),plt.xticks([]),plt.yticks([]) plt.show()