opencv初学(图像12)

文章介绍了如何使用OpenCV库进行直方图计算,包括单通道图像的直方图、彩色图像各通道的直方图以及如何创建和应用mask。接着讨论了图像均衡化技术,如标准直方图均衡化和自适应直方图均衡化(CLAHE),以及这些技术如何改变图像的亮度和对比度,提高可读性。
摘要由CSDN通过智能技术生成

直方图

cv.calcHist(images, channels, mask, histSize, ranges)
  1. images:它是uint8或float32类型的源图像。它应该放在方括号中,即“ [img]”。

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

  1. mask:遮罩图像。为了找到完整图像的直方图,将其指定为“无”。但是,如果要查找图像特定区域的直方图,则必须为此创建一个遮罩图像并将其作为遮罩。

  1. histSize:这表示我们的BIN计数。需要放在方括号中。对于全尺寸,我们通过[256]。

啥是BIN

  1. ranges:这是我们的RANGE。通常为[0,256]。

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

def cv_show(name,image):
    cv2.imshow(name,image)
    cv2.waitKey()
    cv2.destroyAllWindows()


img=cv2.imread('D:/BaiduNetdiskDownload/opencv/Astexia.jpg',0)
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.hist(img.ravel(),256)#参数(直方图信息,BIN的数量)
plt.show()

#三色
color=('b','g','r')
for i,col in enumerate(color):
    img1 = cv2.imread('D:/BaiduNetdiskDownload/opencv/girl.jpg')
    histr = cv2.calcHist([img1],[i],None,[256],[0,256])
    plt.plot(histr,color=col)
    plt.xlim([0,256])
plt.show()

mask创建(即创建出除了中间为255,其他全为0的矩阵)

cv2.bitwise_and()是OpenCV中的一个函数,用于对两个图像进行按位与操作。它的参数含义如下:

src1:第一个输入图像。

src2:第二个输入图像。

mask:可选参数,用于指定操作的掩码图像。

dst:输出图像,与输入图像大小和类型相同。

#mask创建
mask=np.zeros(img.shape[:2],np.uint8)
mask[120:750,200:1800]=255
cv_show('mask',mask)
masked_img=cv2.bitwise_and(img,img,mask=mask)
cv_show('666',masked_img)

均衡化

将直方图变得差不多一样高,变胖一点

累积概率即分布函数

图源3-均衡化效果_哔哩哔哩_bilibili

equ=cv2.equalizeHist(img_boy)
#均衡化
img_boy=cv2.imread('D:/BaiduNetdiskDownload/opencv/boy.png',0)
plt.hist(img.ravel(),256)
equ=cv2.equalizeHist(img_boy)
plt.hist(equ.ravel(),256)
plt.show()
res=np.hstack((img_boy,equ))
cv_show("0",res)

自适应直方图均衡化

即分区域均衡化,全图统一均衡化可能会使某些位置过白/黑(如图2)

cv2.createCLAHA(clipLimit=8.0, titleGridSize=(8, 8))

参数1:clipLimit:颜色对比度的阈值(用来防止每一个区域之间割裂感严重)

参数2:titleGridSize:进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作

#自适应直方图均衡化
room=cv2.imread('D:/BaiduNetdiskDownload/opencv/room.png',0)
old_equ=cv2.equalizeHist(room)

a=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
new_equ = a.apply(room)
res = np.hstack((room,old_equ,new_equ))
cv_show('111',res)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值