Opencv入门系列十

Opencv入门系列十


主要内容:

  • 直方图

直方图:一种通过分析图像灰度值信息来增强图像显示的工具。更直接的说直图是图像内灰度值的统计特性与图像灰度值之间的函数,直方图统计图像内各个灰度级出现的次数。

image-20210207142107343

横坐标:图像中各像素点的灰度级[0,255],对应的是8位位图的256个灰度级

纵坐标:具有该灰度级(像素值)的像素个数。

  • 归一化直方图:纵坐标表示该灰度级出线的概率。

在OpenCV中

● DIMS:表示在绘制直方图时,收集的参数的数量。一般情况下,直方图中收集的数据只有一种,就是灰度级。

● RANGE:表示要统计的灰度级范围,一般为[0, 255]。

● BINS:表示分组的个数。

例如,在灰度图像中,将[0, 255]区间内的256个灰度级,按照每16个像素一组划分为子集。

1.直方图的绘制

Python的模块matplotlib.pyplot中的hist()函数,matplotlib.pyplot.hist()

Python的模块cv2中的calcHist()函数,cv2.calcHist()

1.1 matplotlib.pyplot.hist()

matplotlib.pyplot.hist()其语法如下:

image-20210207142958792

● X:数据源,必须是一维的。图像通常是二维的,需要使用ravel()函数将图像处理为一维数据源以后,再作为参数使用。 -> 输出的y值

● BINS:灰度级的分组。对x值进行定义

1.2 cv2.calcHist()

cv2.calcHist()用于统计图像直方图信息,其语法格式为:

image-20210208113111094

● hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数。

● images:原始图像,该图像需要使用“[ ]”括起来。

● channels:指定通道编号。通道编号需要用“[ ]”括起来,如果输入图像是单通道灰度图像,该参数的值就是[0]。对于彩色图像,它的值可以是[0]、[1]、[2],分别对应通道B、G、R。

● mask:掩模图像。当统计整幅图像的直方图时,将这个值设为None。当统计图像某一部分的直方图时,需要用到掩模图像。

● histSize:BINS的值,该值需要用“[ ]”括起来。例如,BINS的值是256,需要使用“[256]”作为此参数值。

● ranges:像素值范围。例如,8位灰度图像的像素值范围是[0, 255]。

● accumulate:累计(累积、叠加)标识,默认值为False。如果被设置为True,则直方图在开始计算时不会被清零,计算的是多个直方图的累积结果,用于对一组图像计算直方图。该参数允许从多个对象中计算单个直方图,或者实时更新直方图。该参数是可选的,一般情况下不需要设置。

matplotlib.pyplot模块内的plot()函数,可以将函数cv2.calcHist()的返回值绘制为图像直方图。

import matplotlib.pyplot as mp
import cv2

img = cv2.imread("Resources/lena.png",1)
imgHistB = cv2.calcHist([img],[0],None,[256],[0,255])
imgHistG = cv2.calcHist([img],[1],None,[256],[0,255])
imgHistR = cv2.calcHist([img],[2],None,[256],[0,255])
mp.plot(imgHistB,color='b')
mp.plot(imgHistG,color='g')
mp.plot(imgHistR,color='r')
cv2.imshow("img",img)
mp.show()
cv2.waitKey(0)

image-20210208114410821

mp.plot()函数将一系列的数据加入到mp对象中,然后通过mp.show显示出来。

1.3 部分图像的直方图

在绘制部分图像的直方图时,我们需要通过简单的图像提取操作,可以采用calcHist()函数中的mask掩膜来提取,如下:

image-20210208114910707

上掩膜图像和原图进行按位与操作后,黑色的部分将全部是黑色,即变量与0 = 0。而白色部分将是原图像原有位置的那部分,即 变量与1 = 变量。

import matplotlib.pyplot as mp
import cv2
import numpy as np
img = cv2.imread("Resources/lena.png",1)
#制作掩膜
mask = np.zeros(img.shape,dtype=np.uint8)  #大小必须和img相同
mask[0:300,0:300] = 255
cv2.imshow("mask",mask)

imgHistB = cv2.calcHist([img],[0],None,[256],[0,255])
imgHistBmask = cv2.calcHist([img],[0],mask,[256],[0,255])
mp.plot(imgHistB,color='b')
mp.plot(imgHistBmask,color='r')
cv2.imshow("img",img)
mp.show()
cv2.waitKey(0)

2.直方图均衡化

在我们绘制出直方图后,可以观测出图像在各像素段的分布,有时像素点会集中分布在某个像素段内,这样的图像看上去会很单一,我们可以通过对图像进行均衡化后得到比较丰富的图像。如下图:

image-20210209131301341

明显可以看出,图像的色彩更加的丰富了,让我们再看看图像直方图的变化,如下:

image-20210209131353495

直方图均衡化的主要目的是将原始图像的灰度级均匀地映射到整个灰度级范围内,得到一个灰度级分布均匀的图像。直方图均衡化使图像色彩更均衡、外观更清晰,也使图像更便于处理,它被广泛地应用在医学图像处理、车牌识别、人脸识别等领域。

在Opencv中使用cv2.equalizeHist()实现直方图的均衡化, 其语法格式如下:

image-20210209163311653

● src:8位单通道原始图像,只能是灰度图像。

● dst:直方图均衡化处理的结果。

下面是一个简单的实验程序:

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

img = cv2.imread("Resources/lena.png",0)
equalImg = cv2.equalizeHist(img)

imgHist = cv2.calcHist([img],[0],None,[256],[0,255])
equalImgHist = cv2.calcHist([equalImg],[0],None,[256],[0,255])

cv2.imshow("img",img)
cv2.imshow("equalImg",equalImg)

mp.plot(imgHist,color='r')
mp.plot(equalImgHist,color='b')
mp.show()
cv2.waitKey(0)

image-20210209164258076

红色部分直方图是对应没有均衡化之前的img图像,可以看出起像素值分布集中于中间。而蓝色部分是均衡化之后的图像对应的直方图像素值分散于各个像素段中,图像也显得更加鲜明。

3.pyplot模块简介

matplotlib.pyplot模块提供了一个类似于MATLAB绘图方式的框架,可以使用其中的函数方便地绘制图形。

3.1 subplot()

matplotlib.pyplot.subplot()函数用来给当前窗口添加一个子窗口对象,其语法格式为:

image-20210209165018765

● nrows:行数。

● ncols:列数。

● index:窗口序号。

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

img = cv2.imread("Resources/lena.png",0)
equalImg = cv2.equalizeHist(img)

imgHist = cv2.calcHist([img],[0],None,[256],[0,255])
equalImgHist = cv2.calcHist([equalImg],[0],None,[256],[0,255])

cv2.imshow("img",img)
cv2.imshow("equalImg",equalImg)
mp.subplot(1,3,1)
mp.plot(imgHist,color='r')      #加入到窗口1中

mp.subplot(1,3,2)
mp.plot(equalImgHist,color='b')#加入到窗口2中


mp.subplot(1,3,3)
mp.plot(imgHist,color='r')      #加入到窗口3中
mp.plot(equalImgHist,color='b')#加入到窗口3中
mp.show()
cv2.waitKey(0)

image-20210209165415988

mp.plot() 总是将数据加入到最新创建的子窗口中。

3.2 imshow()

matplotlib.pyplot.imshow()用来显示图像。其语法格式为:

image-20210209165603674

● X:图像信息,可以是各种形式的数值。

● cmap:色彩空间。该值是可选项,默认值为null,默认使用RGB(A)色彩空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值