opencv 直方图均衡化,opencv直方图统计
本文将介绍如何使用OpenCV函数进行直方图均衡化,将其应用于灰度和彩色图像,归一化亮度,提高图像对比度。感兴趣的朋友可以了解一下。
00-1010前言灰度直方图均衡化颜色直方图均衡化
目录
图像处理技术是计算机视觉项目的核心,通常是计算机视觉项目中的关键工具。我们可以用它们来完成各种计算机视觉任务。在本文中,我们将介绍如何使用OpenCV函数cv2.equalizeHist()来执行直方图均衡化,并将其应用于灰度和彩色图像。函数cv2.equalizeHist()使亮度正常化,并提高图像的对比度。
前言
使用cv2.equalizeHist()函数均衡给定灰度图像的对比度:
#加载图像并将其转换为灰度图像
image=cv2.imread(example.png )
gray_image=cv2.cvtColor(image,cv2。COLOR_BGR2GRAY)
hist=cv2.calcHist([gray_image],[0],None,[256],[0,256])
#直方图均衡化
gray _ image _ eq=cv2 . equalize hist(gray _ image)
#直方图均衡化后的图像直方图
hist _ eq=cv2 . calchist([gray _ image _ eq],[0],None,[256],[0,256])
为了更多地了解直方图均衡化,我们修改原始灰度图像,对图像的每个像素加/减30,计算直方图均衡化前后的直方图:
M=np.ones(gray_image.shape,dtype=uint8) * 30
#图像的每个像素加30
add _ image=cv2 . add(gray _ image,M)
hist _ added _ image=cv2 . calchist([added _ image],[0],None,[256],[0,256])
#直方图均衡化
added _ image _ eq=cv2 . equalize hist(gray _ image _ eq)
hist _ eq _ added _ image=cv2 . calchist([added _ image _ eq],[0],None,[256],[0,256])
#图像的每个像素减去30
subtracted_image=cv2.subtract(灰色_图像,M)
hist _ subtracted _ image=cv2 . calchist([subtracted _ image],[0],None,[256],[0,256])
#直方图均衡化
subtracted _ image _ eq=cv2 . equalize hist(subtracted _ image)
hist _ eq _ subtracted _ image=cv2 . calchist([subtracted _ image _ eq],[0],None,[256],[0,256])
最后,画出所有这些图像:
def show _ img _ with _ matplotlib(color _ img,title,pos):
img_RGB=color_img[:-1]
ax=plt.subplot(3,4,pos)
plt.imshow(img_RGB)
plt.title(title,fontsize=8)
plt.axis(“关”)
def show _ hist _ with _ matplotlib _ gray(历史,标题,位置,颜色):
ax=plt.subplot(3,4,pos)
PLT . xlabel( bin )
plt.ylabel(像素数)
plt.xlim([0,256])
plt.plot(历史,颜色=颜色)
#可视化
show _ img _ with _ matplotlib(cv2 . CVT color(gray _ image,cv2。COLOR_GRAY2BGR),灰色,1)
show _ hist _ with _ matplotlib _ gray(hist,灰度直方图,2, m )
显示_图像_w
ith_matplotlib(cv2.cvtColor(added_image, cv2.COLOR_GRAY2BGR), "gray lighter", 5)
show_hist_with_matplotlib_gray(hist_added_image, "grayscale histogram", 6, m)
show_img_with_matplotlib(cv2.cvtColor(subtracted_image, cv2.COLOR_GRAY2BGR), "gray darker", 9)
show_hist_with_matplotlib_gray(hist_subtracted_image, "grayscale histogram", 10, m)
# 其他图像的可视化方法类似,不再赘述
# ...
程序运行的输出如下图所示:
在上图中,我们可以看到三个均衡化后的图像非常相似,这也反映在均衡化后的直方图中,这是因为直方图均衡化倾向于标准化图像的亮度,同时增加对比度。
颜色直方图均衡化
使用相同的方法,我们可以在彩色图像中执行直方图均衡,将直方图均衡应用于 BGR 图像的每个通道(虽然这不是彩色图像直方图均衡的最佳方法),创建 equalize_hist_color()
函数,使用 cv2.split()
分割 BGR
图像并将 cv2.equalizeHist()
函数应用于每个通道,最后,使用 cv2.merge()
合并结果通道:
def equalize_hist_color(img):
接下来,将此函数应用于三个不同的图像:原始 BGR 图像、将原始图像的每个像素值添加 10、将原始图像的每个像素值减去 10,并计算直方图均衡前后的直方图:
# 加载图像
最后,绘制所有这些图像:
def show_img_with_matplotlib(color_img, title, pos):
将直方图均衡化应用于 BGR
图像的每个通道并不是颜色直方图均衡化的好方法,这是由于 BGR
色彩空间的加性特性导致彩色图像的颜色变化很大。由于我们独立地改变三个通道中的亮度和对比度,因此在合并均衡通道时,这可能会导致图像中出现新的色调,正如上图所看到的那样。
一种颜色直方图均衡化更好的方法是将 BGR 图像转换为包含亮度/强度通道的色彩空间( Yuv
、Lab
、HSV
和 HSL
)。然后,只在亮度通道上应用直方图均衡,最后合并通道并将它们转换回 BGR
颜色空间,以 HSV
空间为例,创建 equalize_hist_color_hsv()
函数实现上述颜色直方图归一化方法:
def equalize_hist_color_hsv(img):
接下来,将此函数应用于三个不同的图像:原始 BGR 图像、将原始图像的每个像素值添加 10、将原始图像的每个像素值减去 10,并计算直方图均衡前后的直方图:
hist_color = hist_color_img(image)
最后,绘制所有这些图像:
# show_img_with_matplotlib() 和 show_hist_with_matplotlib_rgb() 函数与上一示例相同
由上图可以看出,仅均衡 HSV
图像的 V
通道得到的结果比均衡 BGR
图像的所有通道的效果要好很多,也可以将这种方法用于其他包含亮度/强度通道的色彩空间( Yuv
、Lab
和 HSL
)。
以上就是Python OpenCV直方图均衡化详解的详细内容,更多关于OpenCV直方图均衡化的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。