灰度直方图:从数学上来说,图像直方图是描述图像的各个灰度级的统计特性,它是图像灰度值的函数,统计图像中各个灰度级出现的次数或频率。从图像上来说,灰度直方图是一个二维图像,横坐标为图像中各个像素点的灰度级别,纵坐标表示具有各个灰度级别的像素在图像中出现的次数和频率。
直方图均衡化:是指通过某种灰度映射(如:非线性拉伸)使原始图像的直方图变换为在整个灰度范围内均匀分布。
直方图规定化:就是要调整原始图像的直方图去逼近规定的目标直方图。有选择地增强某个灰度范围内的对比度或使图像灰度值满足某种特定的分布。
归一化直方图:各个灰度级出现的次数除以图像的像素总数,即得到各个灰度级出现的概率,从而得到归一化直方图。
统计直方图
通过直方图可以很好的对整幅图像的灰度分布有一个整体的了解,直方图的x轴是灰度值(0~255),y轴是图片中具有同一个灰度值的点的数目。
cv2.calcHist(images,channels,mask,histSize,ranges)
images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
mask: 掩模图像。统整幅图像的直方图就把它为 None。但是如果你想统图像某一分的直方图的你就制作一个掩模图像并使用它。
histSize:BIN 的数目。也应用中括号括来
直方图的绘制
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('./img1.png')
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])
plt.show()
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('./img1.png', 0)
# img.ravel() 将图像转成一维数组 没有中括号
plt.hist(img.ravel(), 256, [0, 256])
plt.show()
局部区域的直方图。首先定义一个掩膜,局部区域全部为1,不感兴趣的区域置为0
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('./img1.png', 0)
# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)
hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])
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()
直方图均衡化
1.统计每个灰度值的个数
2.找出累积分布函数
3.得到累积分布函数最小值cdfmin
4.根据直方图均衡化算式计算均衡化的灰度值
5.得到均衡化后的图像
图像处理 直方图均衡化_纯菜鸟123456的博客-CSDN博客_图像处理直方图均衡化
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./img1.png', 0)
equ = cv2.equalizeHist(img)
hist1=cv2.calcHist([img], [0], None, [256], [0, 256])
hist2=cv2.calcHist([equ], [0], None, [256], [0, 256])
# res = np.hstack((img, equ)) # stacking images side-by-side
# cv2.imshow('img',res)
# cv2.waitKey()
# cv2.imwrite('res.png', res)
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(equ, 'gray')
plt.subplot(223), plt.plot(hist1)
plt.subplot(224), plt.plot(hist2)
plt.xlim([0, 256])
plt.show()