【OpenCV】(五)图像直方图操作

目录

 直方图的计算和绘制

 掩膜的应用

 直方图均衡化

 自适应的直方图均衡化


 直方图的计算和绘制

# 图像直方图
# 是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数
# 这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域
# 一张较暗图片的直方图中的数据多集中于左侧和中间,而整体明亮,只有少量阴影的图像则相反
# 注意:直方图是根据灰度图进行绘制的,而不是彩色图像

# 直方图的一些术语和细节
# dims: 需要统计的特征数目,一般等于1,仅统计灰度值
# bins: 每个特征空间子区段的数目,可译为“直条”或“组距”
# range: 要统计特征的取值范围

# 直方图的意义
# 直方图是图像中像素强度分布的图形表达方式
# 它统计了每一个强度值所具有的像素个数
# 不同的图像直方图可能是相同的

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img = cv.imread("picture/apple.jpg")
# 直方图的计算和绘制
# cv2.calHist(imges, channels, mask, histSize, ranges,[, hist[, accumulate]])
# images: 原图像。当传入函数时应该用中括号[]括起来,例如:[img]。
# channels: 如果输入图像是灰度图,它的值就是[0];如果是彩色图像,传入的参数可以是[0],[1],[2],它们分别对应着通道B,G,R。
# mask: 掩膜图像。要统计整幅图像的直方图就把它设为None。但是如果想统计图像某一部分的直方图,就需要一个掩膜图像,并使用它。
# histSize: BIN的数目。也应该用中括号括起来,例如:[256]。
# ranges: 像素值范围。通常为[0, 256]
histr = cv.calcHist([img], [0], None, [256], [0,256])

# 显示图像
plt.imshow(img[:, :, :: -1])
plt.show()
plt.plot(histr)
plt.grid()
plt.show()

运行结果

【OpenCV】(五)图像直方图操作_第1张图片

原图:【OpenCV】(五)图像直方图操作_第2张图片直方图:【OpenCV】(五)图像直方图操作_第3张图片

 掩膜的应用

# 掩膜
# 是用选定的图像、图形或物体,对要处理的图像进行遮挡,来控制图像处理的区域
# 在数字图像处理同,通常使用二维矩阵数组进行掩膜
# 掩膜是由0和1组成一个二进制图像,利用该掩膜图像对要处理的图像进行掩膜,其中1值的区域被处理,0值的区域被屏蔽,不会处理

# 掩膜的主要用途:
# 1.提取感兴趣区域:用预先制作的感兴趣区掩膜与待处理图像进行“与”操作,得到感兴趣区图像,感兴趣区内图像值保持不变,而区外图像值都为0
# 2.屏蔽作用:用掩膜对图像上某些区域作屏蔽,时期不参加处理或不参加参数的计算,或仅对屏蔽区作处理或统计
# 3.结构特征提取:用相似性变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征
# 4.特殊形状图像制作

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 直接以灰度图的方式读入
img = cv.imread("picture/salt and pepper noise.jpg", 0)

# 创建蒙版
mask = np.zeros(img.shape[:2], np.uint8)
mask[200:600, 400:1000] = 1

# 掩膜
mask_img = cv.bitwise_and(img, img, mask=mask)

# 统计掩膜后图像的灰度图
mask_histr = cv.calcHist([img], [0], mask, [256], [0, 256])

# 显示图像
plt.imshow(img, cmap=plt.cm.gray)
plt.show()
plt.imshow(mask, cmap=plt.cm.gray)
plt.show()
plt.imshow(mask_img, cmap=plt.cm.gray)
plt.show()
plt.plot(mask_histr)
plt.grid()
plt.show()

运行结果

【OpenCV】(五)图像直方图操作_第4张图片

原图:【OpenCV】(五)图像直方图操作_第5张图片蒙版数据:【OpenCV】(五)图像直方图操作_第6张图片

掩膜后数据:【OpenCV】(五)图像直方图操作_第7张图片灰度直方图:【OpenCV】(五)图像直方图操作_第8张图片

 直方图均衡化

# 直方图均衡化
# 作用:把原始图像的灰度直方图从比较集中的某个灰度区间变成在更广泛灰度范围内的分布
# 原理:对图像进行线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同
# 好处:提高图像对比度,特别是有用数据的像素值分布比较接近时,在X光图像中使用广泛,可以提高骨架结构的显示,另外在曝光过度或不足的图像中可以更好的突出细节

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 以灰度图形式读取图像
img = cv.imread("picture/salt and pepper noise.jpg", 0)

# 直方图均衡化处理
# dst = cv.equalizeHist(img)
# img: 灰度图像
# dist: 均衡化后的结果
dst = cv.equalizeHist(img)

# 显示图像
plt.imshow(img, cmap=plt.cm.gray)
plt.show()
plt.imshow(dst, cmap=plt.cm.gray)
plt.show()

 运行结果

原图:【OpenCV】(五)图像直方图操作_第9张图片均衡化后:【OpenCV】(五)图像直方图操作_第10张图片

 自适应的直方图均衡化

# 进行直方图均衡化后,图片背景的对比度改变,但是由于太暗或太亮会丢失大量细节信息
# 自适应直方图均衡化
# 整幅图像被分成很多小块,这些小块称为"tiles"(OpenCV中tiles的大小默认为8*8),然后再对每一个小块分别进行直方图均衡化
# 如果有噪声,噪声会被放大,为了避免这种情况,要用对比度限制。对于每个小块来说,如果直方图的bin超过对比度上限,就把其中的像素点均匀分配到其他bins中,然后再进行直方图均衡化

# 自适应直方图均衡化
# cv.createCLAHE(clipLimit, tileGridSize)
# clipLimit: 对比度限制,默认是40
# tileGridSize: 分块的大小,默认为8*8

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 以灰度图形式读取图像
img = cv.imread("picture/salt and pepper noise.jpg", 0)

# 创建一个自适应均衡化对象,并应用于图像
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
cl1 = clahe.apply(img)

# 显示图像
plt.imshow(img, cmap=plt.cm.gray)
plt.show()
plt.imshow(cl1, cmap=plt.cm.gray)
plt.show()

运行结果

【OpenCV】(五)图像直方图操作_第11张图片

 原图:【OpenCV】(五)图像直方图操作_第12张图片自适应均衡化后:【OpenCV】(五)图像直方图操作_第13张图片

   系列文章

 【OpenCV】(一)图像基础处理

 【OpenCV】(二)图像几何变换

 【OpenCV】(三)图像形态学操作

 【OpenCV】(四)图像平滑操作

 【OpenCV】(五)图像直方图操作 

 【OpenCV】(六)图像边缘检测

 【OpenCV】(七)图像模板匹配和霍夫变换

 【OpenCV】(八)Harris和Shi—tomas图像角点检测

 【OpenCV】(九)视频读写与视频追踪

你可能感兴趣的:(图像处理,opencv,人工智能,计算机视觉)