OpenCV初尝试11——直方图与均衡化

11 直方图与均衡化

11.1 直方图

  • cv2.calcHist(images, channels, mask, histSize, ranges)
    – images:原图像图像格式为uint8或float32,;当传入函数时应用中括号[]括起来;
    – channels:同样用中括号括起来;如果输入图像是灰度图,则它的值为[0];如果是彩色图像传入的参数可以使[0][1][2](它们分别对应着BGR);
    – mask:掩膜图像;统计整幅图像的直方图,则它的值为None;但若你想统计图像的某一份的直方图,我们制作一个掩膜图像并使用它;
    – histSize:BIN的数目;也应用中括号括起来;
    – ranges:像素值范围,常为[0, 256]。

  • 查看图像的直方图

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

if __name__ == '__main__':
	#以灰度图的方式读入
	img = cv2.imread('./cat.jpg', 0)
	#统计灰度图
	hist = cv2.calcHist([img], [0], None, [256], [0, 256])
	#展示直方图,不展示图片的话,我们就直接用matplotlib展示直方图,img.ravel()将图片转换成一维数组
	plt.hist(img.ravel(), 256)
	plt.show()

原图展示:
在这里插入图片描述

效果展示:
在这里插入图片描述

  • 分别查看图像三个颜色通道的直方图
#分别查看3个颜色通道
import cv2
import numpy as np
import matplotlib.pyplot as plt

if __name__ == '__main__':
	#以彩色图的方式读入
	img = cv2.imread('./cat.jpg')
	color = ('b', 'g', 'r')
	for i, col in enumerate(color):
		histr = cv2.calcHist([img], [i], None, [256], [0, 256])
		plt.plot(histr, color = col)
		plt.xlim([0, 256])
	plt.show()

效果展示:
在这里插入图片描述

11.2 掩膜(mask)的创建

话不多说,直接上代码。

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

if __name__ == '__main__':
    # 读入一个灰度图
    img = cv2.imread('./cat.jpg', 0)
    # 展示图像
    cv2.imshow('img', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    # 查看图片大小
    print(img.shape)
    # 定义掩膜
    mask = np.zeros(img.shape[:2], np.uint8)
    # 要保存什么,就把相应区域置成255
    mask[40:120, 40:130] = 255
    # 展示掩膜图像
    cv2.imshow('mask', mask)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    masked_img = cv2.bitwise_and(img, img, mask=mask)
    # 展示合成结果
    cv2.imshow('masked_img', masked_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

结果展示:
灰度图像:
在这里插入图片描述
掩膜图像:
在这里插入图片描述
合成结果:
在这里插入图片描述

11.3 直方图均衡化

11.3.1 直方图均衡化——全局

直方图均衡化是把原始图像的灰度直方图从比较集中的某个灰度区间变成在更广泛灰度范围内的分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。

  • cv2.equalizeHist(img)

  • 返回值为处理好的图像

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

if __name__ == '__main__':
    # 读入一个灰度图
    img = cv2.imread('./cat.jpg', 0)
    
    # 展示未均衡化的直方图
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])
	plt.hist(img.ravel(), 256)
	plt.show()
    # 直方图均衡化
    equ = cv2.equalizeHist(img)
    plt.hist(equ.ravel(), 256)
    plt.show()
    
    # 展示未均衡化和均衡化之后的图像
    res = np.hstack((img, equ))
    # 展示图像
    cv2.imshow('res', res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

结果展示:
未均衡化的直方图:
在这里插入图片描述
均衡化之后的直方图:
在这里插入图片描述
未均衡化与均衡化之后的图像比较:
在这里插入图片描述

11.3.2 自适应直方图均衡化——局部

通过全局的均衡化,我们发现上图展示的猫脸太暗,缺失了一些细节,这时我们为了解决这个问题,需要使用自适应均衡化,将整幅图像划分成许多小块,在各个小块中分别进行直方图均衡化;同时,为了避免噪声的影响,我们需要设置对比度限制,如果直方图中的bin超过对比度的上限的话,就把其中的像素点均匀分散到其他的bins中,然后再进行直方图均衡化。

  • cv2.createCLAHE(clipLimit, tileGridSize)
    – clipLimit:对比度限制,默认是40
    – tileGridSize:分块的大小,默认为8*8
import cv2
import numpy as np
import matplotlib.pyplot as plt

if __name__ == '__main__':
    # 读入一个灰度图
    img = cv2.imread('./cat.jpg', 0)
	equ = cv2.equalizeHist(img)
    # 自适应直方图均衡化
    # 创建一个自适应均衡化对象,并应用到图像上
    clahe = cv2.createCLAHE(2.0, (8, 8))
    res_clahe = clahe.apply(img)
    res = np.hstack((img, equ, res_clahe))
    # 展示图像
    cv2.imshow('res', res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

结果展示:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值