calchist 计算出的像素 较少_opencv 绘制图像直方图,实现直方图均衡化,自适应均衡化...

直方图

直方图简单来说就是图像中每个像素值的个数统计,比如说一副灰度图中像素值为0的有多少个,1的有多少个……直方图是一种分析图像的手段:

图像->直方图,bins=7

直方图计算

opencv库计算直方图

使用 cv.calcHist(images, channels, mask, histSize, ranges) 计算,其中:

参数1:要计算的原图,以方括号的形式传入,如:[img]

参数2:选择图像的某个通道,计算直方图,灰度图像写[0]

参数3:要计算的区域,计算整幅图的话,写None

参数4:直方图横坐标数目

参数5:要计算的像素范围,一般为[0,255]

例如:hist = cv.calcHist([img], [0], None, [256], [0, 255])

numpy库计算直方图

可用Numpy中的函数计算直方图,其中ravel()函数将二维矩阵展平变成一维数组:

hist, bins = np.histogram(img.ravel(), 255, [0, 255])

另一种更高效的方式:

hist = np.bincount(img.ravel(), minlength=256)

直方图绘制

Matplotlib库自带了一个计算并绘制直方图的功能,不需要用到上面的函数:

plt.hist(img.ravel(), 256, [0, 255])

plt.show()

当然,也可以用前面计算出来的结果绘制:

plt.plot(hist)

plt.show()

实验

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

img = cv.imread('hist.jpg', 0)

hist = cv.calcHist([img], [0], None, [256], [0, 255])

plt.plot(hist)

plt.show()

实验结果

原图

原图像的直方图

从直方图上可以看到图片的大部分区域集中在150偏白的附近,这其实并不是很好的效果,下面我们来看看如何改善它。

直方图均衡化

一副效果好的图像通常在直方图上的分布比较均匀,直方图均衡化就是用来改善图像的全局亮度和对比度。其实从观感上就可以发现,前面那幅图对比度不高,偏灰白。对均衡化算法感兴趣的同学可参考:直方图均衡化算法及python实现

图解图像直方图均衡化

opencv中实现图像直方图均衡化

equ = cv.equalizeHist(img)

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

img = cv.imread('hist.jpg', 0)

img_eq = cv.equalizeHist(img)

hist = cv.calcHist([img], [0], None, [256], [0, 255])

hist_eq = cv.calcHist([img_eq], [0], None, [256], [0,255])

plt.figure(1)

plt.subplot(2,2,1)

plt.imshow(img,cmap='gray')

plt.subplot(2,2,2)

plt.imshow(img_eq,cmap='gray')

plt.subplot(2,2,3)

plt.plot(hist)

plt.subplot(2,2,4)

plt.plot(hist_eq)

plt.show()

代码输出结果,可以看到均衡化后图片的亮度和对比度效果明显好于原图

matlab图像直方图均衡化

直方图自适应均衡化

不难看出来,直方图均衡化是应用于整幅图片的,会有什么问题呢?看下图:

左图:原图;右图:直方图均衡化后

很明显,因为全局调整亮度和对比度的原因,脸部太亮,大部分细节都丢失了。

自适应均衡化就是用来解决这一问题的:它在每一个小区域内(默认8×8)进行直方图均衡化。当然,如果有噪点的话,噪点会被放大,需要对小区域内的对比度进行了限制,所以这个算法全称叫:对比度受限的自适应直方图均衡化CLAHE(Contrast Limited Adaptive Histogram Equalization)。

实现直方图自适应均衡化

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

img = cv.imread('tsukuba.jpg', 0)

clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))

cl1 = clahe.apply(img)

plt.subplot(1,2,1)

plt.imshow(img,cmap='gray')

plt.title('Original')

plt.xticks([]),plt.yticks([])

plt.subplot(1,2,2)

plt.imshow(cl1,cmap='gray')

plt.title('Adaptive Histogram Equalization')

plt.xticks([]),plt.yticks([])

plt.show()

实验结果

左图:源图像;右图:自适应均衡化后图像

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值