参考:
Python+OpenCV图像处理之图像直方图 - 九块九毛九 - 博客园
python+opencv直方图均衡化_我是小蚂蚁-优快云博客
1.直方图
图像直方图是反映一个图像像素分布的统计表,其横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。
(1)函数接口
cv.calcHist(
images,
channels,
mask,
histSize,
ranges[, hist[, accumulate]]
)
-> hist
(2)参数说明
images 源图像[img] channels 图像的通道
灰度[0]
彩色[0][1][2]
mask 掩码对象-统计图像的一部分像素点
全部统计:None
histSize 绘制直方图的个数 [256] ranges 绘制像素点的范围 [0,255]
(3)测试代码
import cv2
import matplotlib.pyplot as plt
# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\img1.png",1)
# 缩放
img1=cv2.resize(img,None,fx=0.3,fy=0.3)
cv2.imshow('img1',img1)
# 获取直方图
hist_b=cv2.calcHist([img1],[0],None,[256],[0,255])
hist_g=cv2.calcHist([img1],[1],None,[256],[0,255])
hist_r=cv2.calcHist([img1],[2],None,[256],[0,255])
# 绘制直方图
plt.plot(hist_b,'b')
plt.plot(hist_g,'g')
plt.plot(hist_r,'r')
plt.show()
结果输出
根据直方图可以看出,图像大部分的像素点聚集在某几个值上,形成尖峰。
掩码直方图测试代码:
只能针对灰度图
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\img1.png",0)
# 缩放
img1=cv2.resize(img,None,fx=0.3,fy=0.3)
mask=np.zeros(img1.shape,np.uint8)
# 选择哪一部分的图像进行展示
mask[50:150,200:400]=255
# 与操作
hist_full=cv2.bitwise_and(img1,mask)
# 显示掩码图像
imgs=np.hstack([img1,mask,hist_full])
cv2.imshow('imgs',imgs)
# 获取掩码的直方图
hist=cv2.calcHist([hist_full],[0],mask,[256],[0,255])
# 绘制掩码直方图
plt.plot(hist,'r')
plt.show()
2.图像均衡化
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法,是图像增强的一个手段。
直方图均衡化函数包括全局直方图均衡化equalizeHist和局部直方图均衡化createCLAHE
(1)全局直方图均衡化equalizeHist
函数接口:
cv.equalizeHist(
src[, dst]
)
-> dst
参数说明:
src Source 8-bit single channel image. dst Destination image of the same size and type as src .
更多参考:
代码测试——灰度照片
import cv2
import numpy as np
# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\flower.png",0)
# 缩放
img_resize=cv2.resize(img,None,fx=0.5,fy=0.5)
# 图像均衡化
img_equ=cv2.equalizeHist(img_resize)
imgs=np.hstack([img_resize,img_equ])
cv2.imshow('imgs',imgs)
cv2.waitKey()
代码测试——彩色照片
import cv2
import numpy as np
# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\flower.png",1)
# 缩放
img_resize=cv2.resize(img,None,fx=0.5,fy=0.5)
# b g r分离
(b,g,r)=cv2.split(img_resize)
# 图像均衡化
img_b=cv2.equalizeHist(b)
img_g=cv2.equalizeHist(g)
img_r=cv2.equalizeHist(r)
# b g r合成
new_img=cv2.merge((img_b,img_g,img_r))
imgs=np.hstack([img_resize,new_img])
cv2.imshow('imgs',imgs)
cv2.waitKey()
(2)局部直方图均衡化createCLAHE
函数接口:
cv.createCLAHE(
[, clipLimit[, tileGridSize]]
)
-> retval
参数说明:
clipLimit 小于clipLimit的像素点不参与均分,大于才参与均分
越接近于0表示越接近于原图
tileGridSize 划分多少块
测试代码——灰度照片
import cv2
import numpy as np
# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\flower.png",0)
# 缩放
img_resize=cv2.resize(img,None,fx=0.5,fy=0.5)
# 局部图像均衡化
model=cv2.createCLAHE(clipLimit=20,tileGridSize=(3,3))
new_img=model.apply(img_resize)
imgs=np.hstack([img_resize,new_img])
cv2.imshow('imgs',imgs)
cv2.waitKey()
测试代码——彩色照片
import cv2
import numpy as np
# 获取照片
img=cv2.imread(r"C:\Users\Nobody\Desktop\flower.png",1)
# 缩放
img_resize=cv2.resize(img,None,fx=0.5,fy=0.5)
# b g r分割
(b,g,r)=cv2.split(img_resize)
# 局部图像均衡化
model=cv2.createCLAHE(clipLimit=20,tileGridSize=(3,3))
new_b=model.apply(b)
new_g=model.apply(g)
new_r=model.apply(r)
# 图像合并
new_img=cv2.merge((new_b,new_g,new_r))
imgs=np.hstack([img_resize,new_img])
cv2.imshow('imgs',imgs)
cv2.waitKey()