十五天掌握OpenCV——直方图均衡化

魏老师学生——Cecil:学习OpenCV-机器视觉之旅

    • 代码演示
  • opencv中的直方图均衡化
    • 代码演示
  • CLAHE有限对比适应性直方图均衡化
    • 代码演示

  1. 高质量图像:像素值分布广泛。
  2. 直方图均衡化:直方图作横向拉伸。
  3. 用途:使所有图片具有相同亮度条件的参考工具。脸部识别等。

代码演示

#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread("juzi.jpg",0)

hist,bins=np.histogram(img.flatten(),256,[0,256]) #flatten() 将数组变成一维

cdf=hist.cumsum() #计算累计分布图
cdf_normalized=cdf*hist.max()/cdf.max()

#构建numpy掩模数组,cdf为原数组,当数组元素为0时掩盖。
cdf_m=np.ma.masked_equal(cdf,0)
cdf_m=(cdf_m-cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
#对被掩盖的元素赋值
cdf=np.ma.filled(cdf_m,0).astype('uint8')
img2=cdf[img]

plt.plot(cdf_normalized,color='b')
plt.hist(img.flatten(),256,[0,256],color='r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'),loc='upper left')
plt.show()

十五天掌握OpenCV——直方图均衡化_第1张图片

opencv中的直方图均衡化

cv2.equalizeHist() ——解释:直方图均衡化函数。输入图片–灰度图像;输出图片–直方图均衡化后的图像。

代码演示

#coding=utf-8
import cv2
import numpy as np

while(1):
    img=cv2.imread("juzi.jpg",0)
    equ=cv2.equalizeHist(img)
    res=np.hstack((img,equ)) #并排堆叠图像
    cv2.waitKey(0)
    cv2.imshow("res",res)
    cv2.imwrite("res.png",res)

十五天掌握OpenCV——直方图均衡化_第2张图片

CLAHE有限对比适应性直方图均衡化

  1. 解决问题:图像中某个部分因为亮度太高丢失信息。
  2. 解决方法:将图像切成很多小块(titles),opencv中小块默认大小8*8.对各小块进行均衡化。
  3. 对比度限制:避免噪声放大。
  4. 去除小块间人造边界:双线性差值对小块缝合。

代码演示

#coding=utf-8
import cv2
import numpy as np
while(1):
    img=cv2.imread("juzi.jpg",0)

    clahe=cv2.createCLAHE(clipLimit=2.0,tileGridSize=(5,5))
    cl1=clahe.apply(img)

    cv2.waitKey(0)
    cv2.imshow('original',img)
    cv2.imshow('res',cl1)
    cv2.imwrite('clahe_2.jpg',cl1)

你可能感兴趣的:(机器视觉)