概念:
图像直方图是表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。
这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。如图:
注意:图像直方图是根据灰度图进行绘制的,而不是彩色图像。
图像直方图的术语:
直方图的意义:
直方图是图像中像素强度分布的图形表达方式。
它统计了每一个强度值所具有的像素个数。
不同的图像的直方图可能是相同的
OpenCv API:
cv2.calcHist(images, channels, mask, histSize, ranges)
参数:
import cv2 as cv
import matplotlib.pyplot as plt
src = cv.imread("E:\\view.jpg", 0) # 直接以灰度图方式读入
img = src.copy()
# 统计灰度图
greyScale_map = cv.calcHist([img], [0], None, [256], [0, 256])
# 绘制灰度图
plt.figure(figsize=(10, 6), dpi=100)
plt.plot(greyScale_map)
plt.grid()
plt.show()
原理:
掩膜是用选定的图像、图形或物体,对要处理的图像进行遮挡,来控制图像处理的区域。
在数字图像处理中,我们通常使用二维矩阵数组进行掩膜。掩膜是由0和1组成一个二进制图像,利用该掩膜图像要处理的图像进行掩膜,其中1值的区域被处理,0值区域被屏蔽,不会处理。
应用:
掩膜的主要用途是:
掩膜在遥感影像处理中使用较多,当提取道路或者河流,或者房屋时,通过一个掩膜矩阵来对图像进行像素过滤,然后将我们需要的地物或者标志突出显示出来。
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
src = cv.imread("E:\\view.jpg", 0) # 直接以灰度图方式读入
img = src.copy()
# 创建蒙版
mask = np.zeros(img.shape[:2], np.uint8)
mask[700:1000, 100:400] = 1
# 掩膜
masked_img = cv.bitwise_and(img, img, mask=mask) # 与操作
# 统计掩膜后图像的灰度图
mask_histr = cv.calcHist([img], [0], mask, [256], [0, 256])
# 显示图像
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8), dpi=100)
axes[0][0].imshow(img, cmap=plt.cm.gray)
axes[0][0].set_title("原图")
axes[0][1].imshow(mask, cmap=plt.cm.gray)
axes[0][1].set_title("蒙版数据")
axes[1][0].imshow(masked_img, cmap=plt.cm.gray)
axes[1][0].set_title("掩膜后图像")
axes[1][1].plot(mask_histr)
axes[1][1].grid()
axes[1][1].set_title("掩膜后图像的灰度直方图")
plt.show()
原理:
想象一下,如果一副图像中的大多数像素点的像素值都集中在某一个小的灰度值值范围之内会怎样呢?如果一幅图像整体很亮,那所有的像素值的取值个数应该都会很高。所以应该把它的直方图做一个横向拉伸(如下图),就可以扩大图像像素值的分布范围,提高图像的对比度,这就是直方图均衡化要做的事情。
“直方图均衡化"是把原始图像的灰度直方图从比较集中的某个灰度区间变成在更广泛灰度范围内的分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。
应用:
提高图像整体的对比度。
特别是有用数据的像素值分布比较接近时,在X光图像中使用广泛,可以提高骨架结构的显示,另外在曝光过度或不足的图像中可以更好的突出细节。
OpenCv API:
cv2.equalizeHist(img)
参数:
img:输入的灰度图
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
src = cv.imread("E:\\qi.png", 0) # 直接以灰度图方式读入
img = src.copy()
# 均衡化处理
dst = cv.equalizeHist(img)
# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img, cmap=plt.cm.gray)
axes[0].set_title("原图")
axes[1].imshow(dst, cmap=plt.cm.gray)
axes[1].set_title("均衡化后的图像")
plt.show()
由来:
上述的直方图均衡化,我们考虑的是图像的全局对比度。的确在进行完直方图均衡化之后,图片背景的对比度被改变了,但在许多情况下,这样做的效果并不好,因为均衡化之后的图像很有可能发生局部过亮或者局部过暗的情况,从而造成数据信息的丢失。
原理:
OpenCv API:
clahe = cv.createCLAHE(clipLimit, tileGridSize)
dst = clahe.apply(img)
参数:
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
src = cv.imread("E:\\qi.png", 0) # 直接以灰度图方式读入
img = src.copy()
# 创建一个自适应均衡化的对象,并应用于图像
clahe = cv.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8))
dst = clahe.apply(img)
# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img, cmap=plt.cm.gray)
axes[0].set_title("原图")
axes[1].imshow(dst, cmap=plt.cm.gray)
axes[1].set_title("自适应均衡化后的图像")
plt.show()