OpenCV:图像直方图计算

这篇具有很好参考价值的文章主要介绍了OpenCV:图像直方图计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

图像直方图为图像中像素强度的分布提供了有价值的见解。通过了解直方图,你可以获得有关图像对比度、亮度和整体色调分布的信息。这些知识对于图像增强、图像分割和特征提取等任务非常有用。

本文旨在为学习如何使用 OpenCV 执行图像直方图计算提供清晰且全面的指南。通过理解和应用直方图分析技术,你可以提高图像质量、执行阈值操作、分析颜色成分、提取有用的特征以及更有效地可视化和理解图像。

图像直方图

每个图像都由单独的像素组成,就像网格上的小点一样。假设我们有一个大小为 250 列和 100 行的图像,总共 2500 个像素。每个像素都可以有不同的颜色值,用 0 到 255 范围内的数字表示。

为了可视化图像中颜色值的分布,我们可以创建直方图。该直方图充当一组条形图,显示具有相同颜色值的像素数。通过比较条形的高度,我们可以轻松识别图像中哪些颜色值更突出或更频繁地出现。这种图形表示为图像的整体颜色组成和分布提供了宝贵的见解。

OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

图像直方图(单色)

现在记住,像素强度

0 → 黑色

255 → 白色

因此,如果我们的直方图向左移动(左偏),则图像会包含更多黑色像素;如果我们的直方图向右移动(右偏),图像会包含更多白色像素。

OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

左偏和右偏直方图

所以我相信你已经完全理解了,

  • 更黑→更暗的图像

  • 更白→更亮的图像

OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

现在让我们在 OpenCV 中进行直方图计算。

首先,我们将加载图像并将其可视化。

#import necessary libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt

#using opencv to read an image
#BGR Image
image = cv2.imread("C:/users/public/pictures/nature.jpg")

#visualizing
cv2.namedWindow("BGR Image", cv2.WINDOW_NORMAL);
cv2.imshow("BGR Image",image);

cv2.waitKey(0) & 0xFF 
cv2.destroyAllWindows()
OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

在绘制直方图之前,我们可以分离该图像中的颜色通道。

B = image[:,:,0] #blue layer
G = image[:,:,1] #green layer
R = image[:,:,2] #red layer

现在我们使用 OpenCV 函数 cv.calcHist() 计算并找到每一层的直方图,并使用 OpenCV 和 Matplotlib 函数绘制这些直方图

cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

● images:uint8 或float32 类型的源图像。它应该放在方括号中,即“[img]”。

● channels:也在方括号中给出。它是我们计算直方图的通道的索引。例如,如果输入是灰度图像,则其值为[0]。对于彩色图像,可以通过[0]、[1]或[2]分别计算蓝色、绿色或红色通道的直方图。

● mask:蒙版图像。为了找到整个图像的直方图,它被指定为“None”。但是,如果你想找到图像特定区域的直方图,则必须为其创建一个蒙版图像并将其作为蒙版。

● histSize:BIN 计数。需要在方括号中给出。对于全尺寸,我们通过[256]。

● ranges:范围。通常是[0,256]。

B_histo = cv2.calcHist([image],[0], None, [256], [0,256])
G_histo = cv2.calcHist([image],[1], None, [256], [0,256])
R_histo = cv2.calcHist([image],[2], None, [256], [0,256])

现在我们使用 matplotlib 将它们绘制在子图中。

OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

你可以在不同设置的图像上尝试此操作。

OpenCV:图像直方图计算,opencv,人工智能,计算机视觉
OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

完整代码

#import necessary libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt

#using opencv to read an image
#BGR Image
image = cv2.imread("C:/users/public/pictures/nature.jpg")

#seperating colour channels
B = image[:,:,0] #blue layer
G = image[:,:,1] #green layer
R = image[:,:,2] #red layer

#calculating histograms for each channel
B_histo = cv2.calcHist([image],[0], None, [256], [0,256])
G_histo = cv2.calcHist([image],[1], None, [256], [0,256])
R_histo = cv2.calcHist([image],[2], None, [256], [0,256])

#visualizing histograms
plt.subplot(2, 2, 1)
plt.plot(B_histo, 'b')
plt.subplot(2, 2, 2)
plt.plot(G_histo, 'g')
plt.subplot(2, 2, 3)
plt.plot(R_histo, 'r')

#visualizing image
cv2.namedWindow("BGR Image", cv2.WINDOW_NORMAL);
cv2.imshow("BGR Image",image);
cv2.waitKey(0) & 0xFF 
cv2.destroyAllWindows()

曝光过度和曝光不足的图像

然后我们可以扩展这个想法来识别曝光过度(太亮)的图像和曝光不足(太暗)的图像。

OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

让我们看看这些图像的直方图。

OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

使用 Matplotib 和 OpenCV 绘制直方图

显然,一个直方图左偏,表示图像曝光不足,而另一直方图右偏,表示图像曝光过度。

在这里,我们只需查看直方图就可以清楚地了解图像是否曝光不足或曝光过度。

直方图均衡

考虑曝光不足或曝光过度的图像,其像素值仅局限于某个特定的值范围。

例如:较亮的图像将所有像素限制为高值。

但是一个好的图像将具有来自图像的所有区域的像素。所以你需要将这个直方图拉伸到两端。这通常会提高图像的对比度。

当对彩色图像执行直方图均衡时,我们通常将该过程分别应用于图像中RGB颜色值的红色、绿色和蓝色分量。

首先,我们读取图像并将图像分成三个颜色层。

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

#using opencv to read an image
#BGR Image
image = cv2.imread("C:/users/public/pictures/underexposed_image.jpg")

#seperating colour channels
B = image[:,:,0] #blue layer
G = image[:,:,1] #green layer
R = image[:,:,2] #red layer

然后我们使用 cv.equalizeHist () 来均衡每个颜色层的直方图。使用 Matplotlib 和 OpenCV 将它们可视化。

b_equi = cv2.equalizeHist(B)
g_equi = cv2.equalizeHist(G)
r_equi = cv2.equalizeHist(R)

plt.imshow(b_equi)
plt.title("b_equi")
plt.show()
plt.imshow(g_equi)
plt.title("g_equi")
plt.show()
plt.imshow(r_equi)
plt.title("r_equi")
plt.show()
OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

使用 OpenCV 均衡 R、G 和 B 层

通过均衡的颜色层,我们使用 cv.calcHist() 计算每种颜色的直方图。然后将它们全部绘制出来。

B_histo = cv2.calcHist([b_equi],[0], None, [256], [0,256]) 
G_histo = cv2.calcHist([g_equi],[0], None, [256], [0,256])
R_histo = cv2.calcHist([r_equi],[0], None, [256], [0,256])

plt.subplot(2, 2, 1)
plt.plot(G_histo, 'g')
plt.subplot(2, 2, 2)
plt.plot(R_histo, 'r')
plt.subplot(2, 2, 3)
plt.plot(B_histo, 'b')

你一定已经注意到,我们在“channels”位置仅使用了 [0]。在前面的例子中,我们使用了所有[0]、[1]和[2]。这是由于分离通道的可用性。因此只有 1 个通道。因此,对于所有直方图,“channels”为 [0]

或者,你可以获取原始图像中每个通道的直方图,并使用均衡后的颜色层绘制它们。

#calculate histograms for each channel seperately
#Equilized channels
B_histo = cv2.calcHist([b_equi],[0], None, [256], [0,256]) 
G_histo = cv2.calcHist([g_equi],[0], None, [256], [0,256])
R_histo = cv2.calcHist([r_equi],[0], None, [256], [0,256])
#Original channels
BO_histo = cv2.calcHist([image],[0], None, [256], [0,256]) 
GO_histo = cv2.calcHist([image],[1], None, [256], [0,256])
RO_histo = cv2.calcHist([image],[2], None, [256], [0,256])

#visualize the channel histograms seperately
plt.figure(figsize=(10,12), )

plt.subplot(3, 2, 1)
plt.title("Green Original")
plt.plot(GO_histo, 'g')

plt.subplot(3, 2, 2)
plt.title("Green Equilized")
plt.plot(G_histo, 'g')

plt.subplot(3, 2, 3)
plt.title("Red Original")
plt.plot(RO_histo, 'r')

plt.subplot(3, 2, 4)
plt.title("Red Equilized")
plt.plot(R_histo, 'r')

plt.subplot(3, 2, 5)
plt.title("Blue Original")
plt.plot(BO_histo, 'b')

plt.subplot(3, 2, 6)
plt.title("Blue Equilized")
plt.plot(B_histo, 'b')
OpenCV:图像直方图计算,opencv,人工智能,计算机视觉
s

原始图像颜色直方图与均衡图像颜色直方图

继续下一步,我们现在拥有的只是层。为了从中获得图像,我们需要合并它们。

equi_im = cv2.merge([b_equi,g_equi,r_equi])

现在让我们并排查看均衡后的图像和原始图像。

cv2.namedWindow("Original Image", cv2.WINDOW_NORMAL);
cv2.imshow("Original Image",image);
cv2.namedWindow("New Image", cv2.WINDOW_NORMAL);
cv2.imshow("New Image",equi_im);

cv2.waitKey(0) & 0xFF 
cv2.destroyAllWindows()
OpenCV:图像直方图计算,opencv,人工智能,计算机视觉

使用 OpenCV 均衡图像

完整代码

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

#using opencv to read an image
#BGR Image
image = cv2.imread("C:/users/public/pictures/underexposed_image.jpg")

#seperating colour channels
B = image[:,:,0] #blue layer
G = image[:,:,1] #green layer
R = image[:,:,2] #red layer

#equilize each channel seperately
b_equi = cv2.equalizeHist(B)
g_equi = cv2.equalizeHist(G)
r_equi = cv2.equalizeHist(R)

#calculate histograms for each channel seperately
B_histo = cv2.calcHist([b_equi],[0], None, [256], [0,256]) 
G_histo = cv2.calcHist([g_equi],[0], None, [256], [0,256])
R_histo = cv2.calcHist([r_equi],[0], None, [256], [0,256])

#merge thechannels and create new image
equi_im = cv2.merge([b_equi,g_equi,r_equi])

#visualize the equilized channels seperately
plt.imshow(b_equi)
plt.title("b_equi")
plt.show()
plt.imshow(g_equi)
plt.title("g_equi")
plt.show()
plt.imshow(r_equi)
plt.title("r_equi")
plt.show()

#visualize the channel histograms seperately
plt.subplot(2, 2, 1)
plt.plot(G_histo, 'g')
plt.subplot(2, 2, 2)
plt.plot(R_histo, 'r')
plt.subplot(2, 2, 3)
plt.plot(B_histo, 'b')

#visualize the original and equilized images
cv2.namedWindow("Original Image", cv2.WINDOW_NORMAL);
cv2.imshow("Original Image",image);
cv2.namedWindow("New Image", cv2.WINDOW_NORMAL);
cv2.imshow("New Image",equi_im);

cv2.waitKey(0) & 0xFF 
cv2.destroyAllWindows()

感谢阅读!文章来源地址https://www.toymoban.com/news/detail-599988.html

到了这里,关于OpenCV:图像直方图计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Opencv实践 - 图像直方图均衡化

         

    2024年02月11日
    浏览(43)
  • 【OpenCV • c++】直方图计算 | 绘制 H-S 直方图 | 绘制一维直方图 | 绘制 RGB 三色直方图

      直方图广泛应用于很多计算机视觉处理当中。通过标记帧与帧之间显著的边缘和颜色的变化,可以检测视频中的场景变化。在每个兴趣点设置一个有相似特征的直方图所构成的“标签”,可以用来标记各种不同的事情,比如图像的色彩分布,物体边缘梯度模板等等。是计

    2024年02月09日
    浏览(55)
  • 【opencv】教程代码 —Histograms_Matching(2)计算直方图、直方图比较、直方图均衡、模板匹配...

    计算直方图 直方图比较 图像进行直方图均衡化处理 模板匹配 1. calcHist_Demo.cpp 计算直方图 这段代码的功能是加载图像,分离图像的三个颜色通道,然后分别计算这三个通道的直方图,绘制出来并显示结果。直方图是图像中像素值分布的图形表示,可以用于图像分析或图像处

    2024年04月11日
    浏览(51)
  • Python-OpenCV中的图像处理-图像直方图

    通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度的点的数目。 BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到255,你就需要 256 个数来显示上面的直方图。但是,如果你不需

    2024年02月12日
    浏览(71)
  • OpenCV-Python中的图像处理-图像直方图

    通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度的点的数目。 BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到255,你就需要 256 个数来显示上面的直方图。但是,如果你不需

    2024年02月12日
    浏览(61)
  • Python-OpenCV中的图像处理-直方图

    通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度的点的数目。 BINS:上面的直方图显示了每个灰度值对应的像素数。如果像素值为 0到255,你就需要 256 个数来显示上面的直方图。但是,如果你不需

    2024年02月13日
    浏览(75)
  • 我在Vscode学OpenCV 图像处理五(直方图处理)

    直方图是一种统计图,显示了图像中每个灰度级别(或颜色通道)的像素数量。通过分析图像的直方图,可以获得关于图像对比度、亮度和颜色分布等方面的重要信息。 了解图像的对比度、亮度和色彩分布等信息。你可以使用OpenCV中的函数来计算和绘制图像的直方图,从而进

    2024年01月21日
    浏览(77)
  • Python Opencv实践 - 图像直方图自适应均衡化

       

    2024年02月11日
    浏览(47)
  • calHist()-使用OpenCV和C++计算直方图

    在计算机视觉中,几乎处处都使用直方图。对于阈值计算,我们使用灰度直方图。对于白平衡,我们使用直方图。对于图片中的对象跟踪,比如CamShift技术,我们使用颜色直方图,采用颜色直方图作为特征。 在更抽象的意义上,从梯度直方图形成 HOG 和 SIFT 描述符。 直方图也

    2024年01月17日
    浏览(58)
  • C#使用OpenCv(OpenCVSharp)图像直方图均衡化处理实例

    本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行直方图均衡化处理。 直方图均衡化原理 直方图均衡化(Histogram Equalization)是一种常用的图像增强技术,用于改善图像的对比度和亮度分布。它通过重新分配图像灰度级的像素值,使得图像的直方图在灰度范围内更加

    2024年02月07日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包