脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python OpenCV图像直方图处理

python OpenCV图像直方图处理

2022-06-28 10:52吃猫的鱼python Python

这篇文章主要介绍了python OpenCV图像直方图处理,文章通过matplotlib画一个直方图展开详情,具有一定的参考价值,需要的小伙伴可以参考一下

1.图像直方图基本含义和绘制

首先我们先要了解一下python三大剑客之一——matplotlib
我们都知道matlab作为一个工具是公认的绘图牛,但是我想说的是python下的matplotlib这个超级剑客也是非常厉害的,因为python近年来才火热起来,所以热度没有matlib高,但是matlib可以实现的功能作为python都是差不多可以实现的。
我们回归正题,先来介绍下matplotlib怎么简单的画一个直方图。

import numpy as np
import matplotlib.pyplot as plt
x=np.arange(0,5,0.1)
y=np.sim(x)
plt.plot(x,y)

简单的不能再简单了吧,我们使用它去绘制一个sin(x)的函数图像。

python OpenCV图像直方图处理

那么matplotlib如何和CV一起工作呢?

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("imageoatGray.bmp")
histb = cv2.calcHist([o],[0],None,[256],[0,255])
plt.plot(histb,color="b")
plt.show()

结果是(也很好理解吧):

python OpenCV图像直方图处理

针对于彩色图像我们也可以针对BGR分别作图。

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("imagegirl.bmp")
histb = cv2.calcHist([o],[0],None,[256],[0,255])
histg = cv2.calcHist([o],[1],None,[256],[0,255])
histr = cv2.calcHist([o],[2],None,[256],[0,255])
plt.plot(histb,color="b")
plt.plot(histg,color="g")
plt.plot(histr,color="r")
plt.show()

python OpenCV图像直方图处理

直方图的绘制我们使用的函数还有:函数hist
功能:根据数据源和像素级绘制直方图。
语法: hist(数据源,像素级)
数据源:图像,必须是一维数组。
像素级:一般是256,指[0,255]

python OpenCV图像直方图处理

功能:将多维数组降为一维数组。格式:一维数组=多维数组.ravel()

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("imageoat.jpg")
cv2.imshow("o",o)
cv2.waitKey()
cv2.destroyAllWindows()
plt.hist(o.ravel(),256)

python OpenCV图像直方图处理

2.OpenCV统计直方图并绘制

使用OpenCV对图像进行绘制的和横坐标表示像素值比如[0,255],纵坐标表示像素值的个数。

绘制函数:

hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )

其中,hist返回结果是一个直方图,返回的直方图,是一个二维数组。
image原始图像:图像需要使用“[ ]”括起来使用。
channels:

通道编号需要用中括号括起来输入图像是灰度图时,它的值是[0];彩色图像可以是[0],[1],[2]。分别对应通道B,G,R。
mask:掩码图像统计整幅图像的直方图,设为None。统计图像某一部分的直方图时,需要掩码图像。
histSize
BINS的数量,例如【256】
ranges
像素值范围RANGE
accumulate默认值为false。如果被设置为true,则直方图在开始分配时不会被清零。该参数允许从多个对象中计算单个直方图,或者用于实时更新直方图。多个直方图的累积结果,用于对一组图像计算直方图。

使用OpenCV画出直方图:

import cv2
import matplotlib.pyplot as plt
o=cv2.imread("imagegirl.bmp")
histb = cv2.calcHist([o],[0],None,[256],[0,255])
histg = cv2.calcHist([o],[1],None,[256],[0,255])
histr = cv2.calcHist([o],[2],None,[256],[0,255])
plt.plot(histb,color="b")
plt.plot(histg,color="g")
plt.plot(histr,color="r")
plt.show()

python OpenCV图像直方图处理

3.使用掩码的直方图-直方图、掩膜

python OpenCV图像直方图处理

掩码说实话就是使用掩膜的黑色部分把原始图像的部分给覆盖掉,也称为过滤掉。那么我们怎么做呢?首先我们需要创建一个掩膜:

mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255

首先创建一个全0的和原图像size一致的,然后我们把指定范围指定为白色。然后传入函数内:

import cv2
import numpy as np
import matplotlib.pyplot as plt
显示直方图
image=cv2.imread("imagegirl.bmp",cv2.IMREAD_GRAYSCALE)
mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255
histMI=cv2.calcHist([image],[0],mask,[256],[0,255])
histImage=cv2.calcHist([image],[0],None,[256],[0,255])
plt.plot(histImage)
plt.plot(histMI)

结果是:

python OpenCV图像直方图处理

掩膜原理:

python OpenCV图像直方图处理

说实在的就是与和或的关系,与就是一个不行就都不行。或就是一个行就可以。

python OpenCV图像直方图处理

而我们的掩膜原理主要用到的就是与操作;

python OpenCV图像直方图处理

计算结果 = cv2.bitwise_and(图像1,图像2)

import cv2
import numpy as np
import matplotlib.pyplot as plt
image=cv2.imread("imageoat.bmp",0)
mask=np.zeros(image.shape,np.uint8)
mask[200:400,200:400]=255
mi=cv2.bitwise_and(image,mask)
cv2.imshow("original",image)
cv2.imshow("mask",mask)
cv2.imshow("mi",mi)
cv2.waitKey()
cv2.destroyAllWindows()

python OpenCV图像直方图处理

4.直方图均衡化原理及函数

python OpenCV图像直方图处理

在维基百科是这样定义的:

python OpenCV图像直方图处理

对应在图像上就是:

python OpenCV图像直方图处理

python OpenCV图像直方图处理

前提:如果一幅图像占有全部可能的灰度级,并且均匀分布。
结论:该图像具有高对比度和多变的灰度色调。
外观:图像细节丰富,质量更高。

算法:

  • 1.计算累计直方图
  • 2.将累计直方图进行区间转换
  • 3.在累计直方图中,概率相近的原始值,会被处理为相同的值。

1.计算灰度级出现的概率情况

python OpenCV图像直方图处理

原文地址:https://blog.csdn.net/m0_37623374/article/details/125363314

延伸 · 阅读

精彩推荐