栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Opencv的学习之直方图和均衡化

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Opencv的学习之直方图和均衡化

直方图:
函数cv2.calcHist(images,channels,mask,histSize,ranges)
images:原图像图像格式为uint8或float32.当传入函数时应用[]来括起来[img]
channels:同样用中括号来括它会告函数我们统幅图像的直方图对应的是BGR
mask:掩模图像。统整幅图像的直方图就把它为None
ranges:像素值范围为[0:256]

绘制直方图(灰色图):

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

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


img = cv2.imread (r'D:photodatahome.jpg')
histr = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.hist(img.ravel(),256)
plt.show()

效果展示:

 
绘制多颜色通道:

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

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


#绘制多通道:
img = cv2.imread (r'D:photodatahome.jpg')
color = ('b', 'g', 'r')
#用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,
#同时列出数据和数据下标,一般用在 for 循环当中
for i, col in enumerate(color):
    histr = cv2.calcHist([img], [i], None, [256], [0, 256])
#plt模块下的一个函数,用于画图它可以绘制点和线,并且对其样式进行控制.
    plt.plot(histr)
 #设置x轴的数值显示范围
    plt.xlim([0, 256])
plt.show()

效果展示:

原图和掩码的直方图:

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

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


#mask 掩码
img =cv2.imread(r'D:photodatahome.jpg',0)
#掩码的图像
mask = np.zeros(img.shape[:2],np.uint8) #np.uint8无符号整形
mask[100:300,100:400] = 255             #保存什么值把什么变成255
masked = cv2.bitwise_and (img,img,mask=mask)#与操作,mask=mask表示要提取的区域
res = np.hstack((img,mask,masked))
cv_show('res',res)

效果图:原图、掩码图、最终图

原图和掩码图的直方图:

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

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

img =cv2.imread(r'D:photodatahome.jpg',0)
#掩码的图像
mask = np.zeros(img.shape[:2],np.uint8) #np.uint8无符号整形
mask[100:300,100:400] = 255             #保存什么值把什么变成255
#masked = cv2.bitwise_and (img,img,mask=mask)#与操作,mask=mask表示要提取的区域

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

plt.subplot(221),plt.plot(hist_full),plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

效果:

 

直方图的均衡化(容易丢失细节):

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

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


img = cv2.imread(r'D:photodatalena.jpg',0)
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('asa',res)

效果:

 

自适应直方图均衡化(分块处理):

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

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

img = cv2.imread(r'D:photodatalena.jpg',0)
#自适应直方图均衡化(分块处理)
#第一个数据颜色对比度的阈值,第二个数据进行像素均衡化的网格大小
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))

res_clahe = clahe.apply(img)
res = np.hstack((img,res_clahe))
cv_show('res',res)

效果:

 大家可以对比直方图的均衡化和自适应直方图均衡化两个结果来看一看优缺点,根据自己的需求来选择不同的处理方法

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/923622.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号