opencv 直方图与图片均衡化

直方图

对于cv2.calcHist(images,channels,mask,histSize,ranges)函数解释

- images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
- channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。 
- mask: 掩模图像(即掩码)。统整幅图像的直方图就把它为 None。但是如 果你想统图像某一分的直方图的你就制作一个掩模图像并 使用它。
- histSize:BIN 的数目,也就是要分成几组。也应用中括号括来
- ranges: 像素值范围常为 [0256] 

一般后两个参数是固定的

 导包与定义函数

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline 

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

输出像素值频率直方图

img = cv2.imread('cat.jpg',0) #0表示灰度图
# [0]代表选第一个通道数,当然对img这张图也只有这个通道
hist = cv2.calcHist([img],[0],None,[256],[0,256])
hist.shape
# 得出的是0-255每个值的频数
(256, 1)
plt.hist(img.ravel(),256); 
plt.show()

对于一张彩色图去统计

img = cv2.imread('cat.jpg') 
# opencv拿到的数据通道是bgr的顺序,为了想画出对应颜色的频数统计图,所以给出相对应通道顺序的color元祖
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]) 

 

通过掩码保留自己想保留的地方

创建掩码

# 创建mask
mask = np.zeros(img.shape[:2], np.uint8)
# 感觉跟下面没有区别
# mask = np.zeros(img.shape, np.uint8)
print (mask.shape)
print (img.shape[:2])
#将中间的变为白色,即值置为255
mask[100:300, 100:400] = 255
cv_show(mask,'mask')
(414, 500)
(414, 500)

展示原来的图片

img = cv2.imread('cat.jpg', 0)
cv_show(img,'img')

 

使用掩码

masked_img = cv2.bitwise_and(img, img, mask=mask)#与操作
cv_show(masked_img,'masked_img')

结果比较

hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

plt.subplot(221), plt.imshow(img, 'gray'),plt.title("original drawing")
plt.subplot(222), plt.imshow(mask, 'gray'),plt.title("mask")
#执行完掩码操作后的图像
plt.subplot(223), plt.imshow(masked_img, 'gray'),plt.title("mask after masking")
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

直方图均衡化

概述

原图:

 均衡化后的结果

举个例子,如何计算均衡化

这三个长方形的图不是上面的"狗在草丛"的图片,最下面的长方形是指一张只有四个灰度值的图 

代码展示

img = cv2.imread('cat.jpg',0) #0表示灰度图 #clahe
plt.hist(img.ravel(),256); 
plt.show()

equ = cv2.equalizeHist(img) 
plt.hist(equ.ravel(),256)
plt.show()
# 均匀化后的结果

效果展示

对于猫这张图

res = np.hstack((img,equ))
cv_show(res,'res')
#相对来说,颜色更显眼一些

对于lenna这张图

#对于lena这张图进行对比
img1 = cv2.imread('lena.jpg',0)
equ2 = cv2.equalizeHist(img1) 
res = np.hstack((img1,equ2))
cv_show(res,'res')

对于第三张图,丢失了一些细节

#对于lena这张图进行对比
#相1对于原图来说,更亮了,但丢失了一些细节
img1 = cv2.imread('clahe.jpg',0)
equ2 = cv2.equalizeHist(img1) 
res = np.hstack((img1,equ2))
cv_show(res,'res')

自适应直方图均衡化 

发现局部做均衡化的图跟全局做均衡化比,既保留细节,又把整体图片看上去更亮了

# 划定窗口大小,只在窗口里面做均衡化处理,而不是全局做均衡化处理,目的是为了不丢失一些细节
# 这里给出的窗口是8*8
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) 

res_clahe = clahe.apply(img1)
#三张图进行比较
res = np.hstack((img1,equ2,res_clahe))
cv_show(res,'comparation')

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十有久诚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值