分享

python+opencv图像处理(十五)

 pythonjava学习 2021-04-06

直方图均衡

直方图均衡化是通过对图像的直方图进行修正来获得图像增强效果的方法,主要是进行对比度增强,就是让亮的更亮,暗的更亮。
1、灰度图像的直方图均衡
先上图看效果。
如图上标题所示,第一张是原图,底下是其直方图。从直方图可以看到,其灰度分布是极为不均匀的,集中在80170灰度级之间。通过直方图均衡化后,右图为均衡化后的图及其直方图,均衡化后的图明显比原图看起来舒服得多。

(实验原图来源于网络)

完整代码如下:

import cv2

import numpy as np

from matplotlib import pyplot as plt

import matplotlib as mpl

mpl.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体

img = cv2.imread('E:\\image\\lena1.jpg',0)#读入灰度图像

equ = cv2.equalizeHist(img)#直方图均衡,返回值为均衡化后的图

plt.subplot(221),plt.imshow(img,'gray'),plt.title("原图")

plt.subplot(222),plt.imshow(equ,'gray'),plt.title("均衡化后的图")     

plt.subplot(223),plt.hist(img.ravel(),256,[0,256]),plt.title("原图直方图")

plt.subplot(224),plt.hist(equ.ravel(),256,[0,256]),plt.title("均衡化后的直方图")

plt.show()

由代码可知,做直方图均衡时,可直接用opencv自带的函数equalizeHist()来进行直方图均衡。

---------------------------------我是广告的分界线

---------------------------------我是广告的分界线

2、彩色图像直方图均衡
对于彩色图像的直方图均衡化,可以考虑使用R,G,B三个通道分别均衡化,然后将三个通道合在一起。但要注意的是,这样有可能会改变色调。
如下图所示:

其完整代码如下:

import cv2

import numpy as np

from matplotlib import pyplot as plt

import matplotlib as mpl

mpl.rcParams['font.sans-serif']=['SimHei']

img = cv2.imread('E:\\image\\lena.jpg')

(b,g,r)=cv2.split(img)#拆分图像

bH = cv2.equalizeHist(b)#合通道进行直方图均衡

gH = cv2.equalizeHist(g)

rH = cv2.equalizeHist(r)

result = cv2.merge((bH, gH, rH))#融合回原图像

plt.subplot(221),plt.imshow(img[:,:,[2,1,0]])

plt.title("原图")

plt.subplot(222),plt.imshow(result[:,:,[2,1,0]])

plt.title("均衡化后的图")                        

plt.subplot(223)

color = ('b', 'g', 'r')

for i , color in enumerate(color):

    hist = cv2.calcHist([img], [i], None, [256], [0, 256])  

    plt.plot(hist, color)

plt.title("原图直方图")

plt.subplot(224)

color = ('b', 'g', 'r')

for i , color in enumerate(color):

    hist = cv2.calcHist([result], [i], None, [256], [0, 256])  

    plt.plot(hist, color)

plt.title("均衡化后的直方图")

plt.show()

也可以将其颜色空间转换至YUV空间,仅对其亮度空间进行直方图均衡即可。
上图看效果:

(实验原图来源于网络)

(图像不好找啊!!!)

其完整代码如下:

import cv2

import numpy as np

from matplotlib import pyplot as plt

import matplotlib as mpl

mpl.rcParams['font.sans-serif']=['SimHei']

img = cv2.imread('E:\\image\\car.jpg')

img_yuv=cv2.cvtColor(img,cv2.COLOR_BGR2YUV)#转换至YUV颜色空间

img_yuv[:,:,0]=cv2.equalizeHist(img_yuv[:,:,0])#对亮度空间进行直方图均衡

result = cv2.cvtColor(img_yuv,cv2.COLOR_YUV2BGR)#转换回彩色图像

plt.subplot(221),plt.imshow(img[:,:,[2,1,0]]),plt.title("原图")

plt.subplot(222),plt.imshow(result[:,:,[2,1,0]]),plt.title("均衡化后的图")                        

plt.subplot(223)

color = ('b', 'g', 'r')

for i , color in enumerate(color):

    hist = cv2.calcHist([img], [i], None, [256], [0, 256])

    plt.plot(hist, color)

plt.title("原图直方图")

plt.subplot(224)

for i , color in enumerate(color):

    hist = cv2.calcHist([result], [i], None, [256], [0, 256])  

    plt.plot(hist, color)

plt.title("均衡化后的直方图")

plt.show()

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多