直方图
OpenCV代码: cv2.calcHist(image, channels, mask, histSize, ranges)
In [3]:
import cv2
img = cv2.imread("D:/WeChat.picture/cat.jpg",0) # 0 表示转为 灰度图
hist = cv2.calcHist([img] , [0] , None ,[256] ,[0,256]) #None 表示 没掩盖 对整个图进行处理
hist.shape # 结果显示出可能有256 个 取值 , 1 表示 2维 统计出现个数
Out[3]:
(256, 1)
In [8]:
# opencv 是 (B G R)的形式 , matplotlib 是 (R B G) 的形式 可用 ravel 转化
import matplotlib.pyplot as plt
plt.hist(img.ravel() , 256) # plt.hist(img.ravel() , 16) 将其 别分为 16 区间
plt.show()
In [5]:
cv2.imshow("img" , img)
cv2.waitKey(0)
cv2.destroyAllWindows()
In [9]:
img = cv2.imread("D:/WeChat.picture/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]) #表示 [ 0 ,x] 表示 x的区间 , 并 建立一个坐标 (第一象限)
# 三个颜色通道在直方图的统计结果
In [22]:
def cv_show(img , name):
cv2.imshow(name , img)
cv2.waitKey(0)
cv2.destroyAllWindows()
import numpy as np
import cv2
img = cv2.imread("D:/WeChat.picture/cat.jpg",0)
mask = np.zeros(img.shape[:2],np.uint8)
print(img.shape)
mask [100:300 ,100:400] = 255
cv_show(mask , "mask")
mask_img = cv2.bitwise_and(img , img , mask =mask) #与操作
cv_show(mask_img ,"mask_img")
(414, 500)
In [23]:
hist_full = cv2.calcHist([img] , [0] , None , [256] , [0 ,256])
hist_mask = cv2.calcHist([img] , [0] , mask , [256] , [0 ,256])
plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()
plt.imshow()函数负责对图像进行处理,并显示其格式,而plt.show()则是将plt.imshow()处理后的函数显示出来。
In [20]:
# 使用plt.subplot来创建小图. plt.subplot(221)表示将整个图像窗口分为2行2列, 当前位置为1.
plt.subplot(221) , plt.imshow(img ,"gray")
plt.subplot(222) , plt.imshow(mask ,"gray" )
plt.subplot(223) , plt.imshow(mask_img ,"gray")
plt.subplot(224) , plt.plot(hist_full) , plt.plot(hist_mask) #直接输出
plt.show()
In [24]:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("D:/WeChat.picture/clahe.jpg",0)
hist = cv2.calcHist([img] , [0] ,None , [256] ,[0 ,256])
plt.hist(img.ravel() ,256) # number 表示分为 多少部分, ravel bgr 转为 rgb
plt.show()
In [135]:
equ = cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()
分小块进行直方图均衡化处理:
In [136]:
import numpy as np
res = np.hstack((img ,equ)) # 要求维度 一致 灰度为2维 彩色图为 3 维度
cv_show(res , "res")
In [137]:
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")
将时域(以时间为主轴,在某个时间发生了什么事情) 转换为频域(只要知道发生了什么事就好,不管在哪个时间发生的,只考虑发生的事情和频率)
傅里叶变换的作用:
滤波:
步骤:
In [41]:
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("D:/WeChat.picture/lena.png", 0) # 需转化为灰度图 处理
# 转换为:float32
img_float32 = np.float32(img)
# 转换到频域
dft = cv2.dft(img_float32 , flags = cv2.DFT_COMPLEX_OUTPUT)
# 平移到原点
dft_shift = np.fft.fftshift(dft)
# 得到灰度图能表示的形式 将实部和虚部转换为0-255之间的数值
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("Magnitude Sepctrum") , plt.xticks([]) , plt.yticks([])
plt.show()
In [61]:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("D:/WeChat.picture/lena.png" , 0)
# 转换为:float32
img_float32 = np.float32(img)
# 转换到频域
dft = cv2.dft(img_float32 , flags = cv2.DFT_COMPLEX_OUTPUT) # 不可省去 flags
# 平移到原点
dft_shift = np.fft.fftshift(dft)
# 计算中心位置
rows , cols = img.shape # 灰度图
crow , ccol = int (rows/2) ,int (cols/2)
# 低通滤波:创建掩码,掩码大小与图像大小一致,保留的位置的边界扩大30,保证能包括所有要保留的区域
mask = np.zeros((rows ,cols ,2) , np.uint8)
mask[crow-30 :crow+30 , ccol-30 :ccol +30] = 1
# IDFT
fshift = dft_shift * mask # 低通
#fshift = dft_shift*mask
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.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() # 不可省去
In [ ]:
In [63]:
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('D:/Wechat.picture/lena.png',0)
# 转换为:float32
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)
# 高通滤波:创建掩码,掩码大小与图像大小一致,保留的位置的边界扩大30,保证能包括所有要保留的区域
mask = np.ones((rows,cols,2),np.uint8) # mask = np.zeros((rows,cols,2),np.uint8) 修改 zeros
mask[crow-30:crow+30, ccol-30:ccol+30] = 0 # mask[crow-30:crow+30, ccol-30:ccol+30] = 1 1 改为 0
# IDFT
fshift = dft_shift * mask # 高通
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.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()