傅里叶变换
傅里叶变换f傅里叶分析之掐死教程(完整版)更新于2014.06.06 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/19763358
相当nice
傅里叶变换的作用
·高频:变化剧烈的灰度分量,例如边界
·低频:变化缓慢的灰度分量,例如一片大海
滤波
·低通滤波器:只保留低频,会使得图像模糊
·高通滤波器:只保留高频,会使得图像细节增强
·opencv中主要就是cv2.dft()和cv2.idft(),输入图像需要先转换成np.float32格式。
·得到的结果中频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift变换来实现。
·cv2.dft()返回的结果是双通道的(实部,虚部),通常还需要转换成图像格式才能展示(0,255)。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = 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]))
#####################这是映射公式20*np.log(
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('Magnitude Spectrum'), plt. xticks([]), plt. yticks([])
plt.show()
dft idft
直方图概念
cv2.calcHist(images,channels,mask,histSize,ranges)
·images:原图像图像格式为uint8或float32。当传入函数时应用中括号]括来例如[img]
·channels:同样用中括号括来它会告函数我们统幅图像的直方图。如果入图像是灰度图它的值就是[0]如果是彩色图像的传入的参数可以是[0[1][2]它们分别
对应着BGR。
·mask:掩模图像。统整幅图像的直方图就把它为None。但是如果你想统图像某一分的直方图的你就制作一个掩模图像并使用它。
·histSize:BIN的数目。也应用中括号括来
·ranges:像素值范围常为[0,256]
img = cv2.imread('cat. jpg',0)#0表示灰度图
hist = cv2. calcHist([img],[0],None, [256],[0,256])
hist.shape
(256,1)
plt.hist(img.ravel(),256);
plt.show()
img = cv2.imread('cat. jpg') color = ('b','g','r') for i, col in enumerate(color): histr = cv2. calcHist([img],[i],None, [256],[0,256]) plt. plot(histr, color = col) plt.xlim([0,256])
mask操作(掩码、掩膜)
#创建mask
mask = np. zeros(img. shape[: 2], np. uint8)
#uint8是无符号整型2的八次方,img是为了保障和目标图片大小一致
mask[100: 300, 100: 400] = 255#保存white
cv_show(mask,'mask')
(414,500)
img = cv2.imread('cat. jpg', 0)
cv_show(img,'img')
masked_img = cv2. bitwise_and(img, img, mask=mask)#与操作
cv_show(masked_img,'masked_img')
hist_full = cv2. calcHist([img], [0], None, [256], [0, 256])#no
hist_mask = cv2. calcHist([img], [0], mask, [256], [0, 256])#mask
plt.subplot(221),plt. imshow(img,'gray')
plt.subplot(222), plt. imshow(mask, 'gray')
plt. subplot(223), plt. imshow(masked_img,'gray')
plt.subplot(224), plt.plot(hist_full), plt. plot(hist_mask)
plt.xlim([0, 256])
plt.show()
mask就是个滤波器,下面这里是低通滤波器
import numpy as np
import cv2
from matplotlib import pyplot as plt
img=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)
rows, cols=img.shape
crow,ccol=int(rows/2),int(cols/2)
#中心位置 低通滤波
mask= np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30,ccol-30:ccol+30]=1
#IDFT
fshift=dft_shift*mask#把低通,就是让边界模糊,高通就是边界明显
#这里mask是和dft的结果做的 dft的结果实部虚部两个维度
f_ishift=np.fft.ifftshift(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.subplot(122),plt.imshow(img_back, cmap ='gray')
plt.title('Result'),plt.xticks([]),plt.yticks([])
plt.show()
当是高频是
直方图均值化
映射变换
img = cv2.imread('clahe. jpg',0)#0表示灰度图 #clahe
plt.hist(img.ravel(),256);
plt.show()
equ = cv2.equalizeHist(img)
plt. hist(equ. ravel(),256)
plt.show()
res=np.hstack((img,equ))
cv_show(res,'res')
实验的结果是拉高了对比度.................过曝?
自适应直方图对比化
线性的差值处理
clipLimit 颜色对比度的阈值 titleGridSize 进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作
clahe = cv2. createCLAHE(clipLimit=2.0, tileGridSize=(8,8)
res_clahe = clahe. apply(img)
res = np. hstack((img, equ, res_clahe)
cv_show (res,' res')