直方图与均衡化

直方图

统计图像中相同像素点的数量。
使用cv2.calcHist(images, channels, mask, histSize, ranges)函数

images:原图像图像格式为uint8或float32,当传入函数时应用[]括起来,例如[img]。
channels:同样用中括号括起来,告诉我们统幅图像的直方图,如果图像是灰度图就是[0],如果是彩色图可以是[0],[1],[2],分别对应BGR。
mask:掩膜图像,统幅图像使用None,若使用一部分需要自行制作。
histSize:BIN的数目,也要中括号。
ranges:像素值范围一般为[0,256]

灰度图

img = cv2.imread('deppb.jpg', 0)
show.cv_show('img', img)
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
h1 = hist.shape
plt.hist(img.ravel(), 256)
plt.show()

灰度图
在这里插入图片描述
直方图
在这里插入图片描述

彩色图

img2 = cv2.imread('deppb.jpg')
show.cv_show('img2', img2)
color = ('b', 'g', 'r')
for i, col in enumerate(color):
    histr = cv2.calcHist([img2], [i], None, [256], [0, 256])
    plt.plot(histr, color=col)
    plt.xlim([0, 256])
plt.show()

彩色图
在这里插入图片描述
直方图
在这里插入图片描述
图为三通道的直方图

mask操作

mask,在指定区域置为255,其余区域置为0,与原图相与,最后得到指定区域的像素点个数统计,绘制直方图。

# 创建mask
show.cv_show('img2', img2)  # 原图
mask = np.zeros(img2.shape[:2], np.uint8)
print(mask.shape)
mask[200: 600, 100: 427] = 255
show.cv_show('mask', mask)  # mask图

masked_img2 = cv2.bitwise_and(img2, img2, mask=mask)
show.cv_show('masked_img2', masked_img2)  # 原图与mask

hist_full = cv2.calcHist([img2], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img2], [0], mask, [256], [0, 256])
plt.plot(hist_full), plt.plot(hist_mask)  # [0]通道直方图对比
plt.show()

mask图
在这里插入图片描述
mask与原图相与
在这里插入图片描述
[0]通道直方图对比
在这里插入图片描述
蓝色为整体直方图,橙色为特定区域直方图。

均衡化

将一副图像的直方图分布通过累积分布函数变成近似均匀分布,从而增强图像的对比度。
在这里插入图片描述
根据像素点个数得到概率值,再算出累积概率类似于分布函数,再由累积概率映射出新的像素值,最后取整。

img3 = cv2.imread('deppb.jpg', 0)
plt.hist(img3.ravel(), 256)  # 原图直方图
plt.show()

equ = cv2.equalizeHist(img3)
plt.hist(equ.ravel(), 256)  # 均衡化后直方图
plt.show()

res = np.hstack((img3, equ))
show.cv_show('res', res)    # 图像对比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到整体均衡化可能导致部分信息丢失。

自适应均衡化

其实是分区域进行均衡化,减少信息丢失。

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))  # 方法
res_clahe = clahe.apply(img3)
plt.hist(res_clahe.ravel(), 256)  # 自适应均衡化后直方图
plt.show()
res = np.hstack((img3, equ, res_clahe))     # 与原图和整体均衡化对比
show.cv_show('res', res)

自适应均衡化的直方图
在这里插入图片描述

对比图
在这里插入图片描述
可以看到对比度加强而且信息丢失得到改善。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字图像的亮度变换是指通过对图像中的像素值进行调整,来改变图像的亮度水平。在Python编程语言中,可以使用OpenCV库来完成该操作。 首先,可以使用cv2.imread()函数读取图像,并将其转换为灰度图像。接下来,使用cv2.equalizeHist()函数进行图像的直方图均衡化,以提高图像的对比度和细节。 直方图是一种统计图表,用于显示图像中每个像素值的出现频率。在Python中,你可以使用matplotlib库的pyplot模块来绘制图像的直方图。可以使用cv2.calcHist()函数计算图像的直方图,并使用pyplot.hist()函数绘制直方图。 最后,将直方图均衡化后的图像与原始图像进行比较,可以发现直方图均衡化后的图像具有更好的对比度和细节。 以下是基于Python编程语言完成数字图像的亮度变换、直方图直方图均衡化的示例代码: ```python import cv2 import matplotlib.pyplot as plt # 读取图像并转为灰度图像 image = cv2.imread('input_image.jpg', 0) # 进行直方图均衡化 equalized_image = cv2.equalizeHist(image) # 计算原始图像的直方图 hist = cv2.calcHist([image], [0], None, [256], [0, 256]) # 计算均衡化图像的直方图 equalized_hist = cv2.calcHist([equalized_image], [0], None, [256], [0, 256]) # 绘制原始图像的直方图 plt.subplot(1, 2, 1) plt.plot(hist) plt.title('Histogram of Original Image') # 绘制均衡化图像的直方图 plt.subplot(1, 2, 2) plt.plot(equalized_hist) plt.title('Histogram of Equalized Image') # 显示图像和直方图 plt.figure() plt.subplot(1, 2, 1) plt.imshow(image, cmap='gray') plt.title('Original Image') plt.subplot(1, 2, 2) plt.imshow(equalized_image, cmap='gray') plt.title('Equalized Image') plt.show() ``` 通过上述代码,我们可以成功实现基于Python编程语言的数字图像亮度变换、直方图直方图均衡化操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值