OpenCV笔记整理【直方图和掩模】

1. 直方图:

直方图统计图像中各个灰度级出现的次数,横坐标为各个像素点的灰度级,纵坐标是具有该灰度级的像素个数。
在这里插入图片描述
上面这个九宫格我们可以想象成一张图像,里面的数字代表当前像素的灰度等级。

用图表显示:X轴代表灰度级,Y轴代表统计次数。
在这里插入图片描述
在实际处理中,X轴代表8位的256个灰度级[0-255],Y轴代表具有相应的灰度级的像素点的个数。
示例: 统计这个纯白色背景下的黑色8的图像的直方图
在这里插入图片描述
在这里插入图片描述

2. 绘制直方图:

模块matplotlib.pyplot 提供了一个类似 MATLAB 的绘图框架,其中hist()函数可以用来绘制直方图。

hist( X,BINS)

  • X为数据源,必须是一维的,二维图像需要通过ravel()函数转换为一维数组之后传入hist()函数。
  • BINS为灰度的分组情况,相当于前面的Y。

上代码:

import cv2
import matplotlib.pyplot as plt

o=cv2.imread("image\\8.bmp")
cv2.imshow("original",o)
# 显示直方图
plt.hist(o.ravel(),256) # 将o转换为一维数组,然后显示256个等级【0-255】

cv2.waitKey()
cv2.destroyAllWindows()

3. OpenCV中绘制直方图:

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

  • hist返回一个一维数组,数组中是每个灰度等级的像素个数。
  • images为原始图像,注意用[]括起来。
  • channels为通道,单通道为[0],彩色通道分别用[0],[1],[2]表示B,G,R。
  • mask为掩模,没有掩模的时候传None。
  • histSize表示BINS子集,注意用[]括起来。
  • ranges表示像素范围,比如单通道[0,255]。
  • accumlate暂时为空。

上代码:

import cv2
import numpy as np

img=cv2.imread("image\\hist.png")
# 计算直方图
hist = cv2.calcHist([img],[0],None,[2],[0,256]) # 这里像素范围[0,255]只能返回0灰
# 度等级的像素数,至于原因求高手分析???

print(hist)

cv2.waitKey()
cv2.destroyAllWindows()

运行:
在这里插入图片描述

使用plot分通道提取直方图代码:

import cv2
import matplotlib.pyplot as plt

o=cv2.imread("image\\girl.bmp")
cv2.imshow("original",o)
histb = cv2.calcHist([o],[0],None,[256],[0,255]) # channels中[0][1][2]分别代表BGR通道
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()

运行:
在这里插入图片描述

4. 掩模后绘制直方图:

与运算:
当M=1时:O AND M = 原图O
当N=0时:O AND M = 0(零)
在这里插入图片描述
构造一个掩模图像

import cv2
import numpy as np

mask=np.zeros([600,600],np.uint8) #构造一个像素为0的二维数组
mask[200:400,200:400]=255 # 将X200-X400、Y200-Y400之间的数组值改为255

cv2.imshow('mask',mask)
cv2.waitKey()
cv2.destroyAllWindows()

运行:
在这里插入图片描述
绘制一个掩模后的图像的直方图:

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

image=cv2.imread("image\\girl.bmp",cv2.IMREAD_GRAYSCALE)

# 创建一个原图一个大小的二维数组,元素0黑色
mask=np.zeros(image.shape,np.uint8)
# 掩模,改变200-400区域为白色
mask[200:400,200:400]=255

# 将原图和掩模图进行与运算,黑色区域被消除
m=cv2.bitwise_and(image,mask)

# 计算原图和掩模后图像的直方图
histImage=cv2.calcHist([image],[0],None,[256],[0,255])
histMI=cv2.calcHist([image],[0],mask,[256],[0,255])
plt.plot(histImage,color='r')
plt.plot(histMI,color='g')

cv2.imshow("o",image)
cv2.imshow("mask",mask)
cv2.imshow("maskImg",m)

cv2.waitKey()
cv2.destroyAllWindows()

运行:
在这里插入图片描述
在这里插入图片描述
Over。。。。。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值