直方图均衡化(调节图像亮度、对比度)
本篇目录
🦄 一、前言
今天看了一禅的视频,挺认同:
我经常在文章中提到:人的一生能遇到真心对你好的不容易,如果遇到了,就要好好珍惜这来之不易的缘分,这种缘分不是特指男女之间,是指所有的缘分,包括家人,朋友,甚至是陪伴在你身边的各种小宠物。。。
什么是真心对你好的人呢?一禅在文中做了很好的总结:
如何知道一个人心里有没有你:一个人心里有没有你,其实很明显,因为他只会在心情好,有时间的状态下才会爱你,他只能接受你符合他心意的一面,一旦你不合他意了,他第一个推开的就是你,分分钟就能放弃你,他对你的付出,只不过是权衡利弊后的选择,只要遇到任何矛盾,他就会觉得离开你,他会过得更好,他不想解决问题,就只能解决你
我从小内向自闭,宅得厉害,认识的人不多,他们绝大部分都对我很好,不会刻意伤害我,所以我对人从来都是不设防,真心相待。
可是最近几年,我在自己家里就被迫体验了长时间。。。高科技营造的声音幻境和。。。的考验,无处可逃,知道了人性的另一面如此。。。你当别人是朋友(纯粹无杂念),别人呢?他(她)可以随时随意就伤害你,原因其实很简单:因为他(她)心里从来没有你,你对于他(她)们来说,只不过是愚弄伤害的对象而已,一切只不过是为了要全方面了解你的性格爱好和各种弱点,方便进一步全面打击你!
人生一直都在选择中,你选择时别人也在选择着,当你被人放弃时,不需要伤心难过,因为这些你遇到的人教会你一个事实真相:在他(她)们心里,你没有那么重要!失去一些不会对你好的人,没有什么可惜的,因为你从来就没有真正拥有过他(她)们对你的真心和珍惜,你所有经历的,不过只是一段段分贝不同,振幅频率不同的声音而已,可能来自真人,也可能是电脑合成,一切并不真实存在,是混合心理学、人工智能、虚拟世界、。。。各种高科技技术混合的作弄。没有拥有过,何来失去?幻象而已,醒过来就好了。
人生不长,一场相遇,一生铭记,不负遇见,不曾亏欠,花自开不是为了被人欣赏,人自律自强不是为了被人称赞。。。很多事情,只要不是你自己主动故意去发生,无论被迫经历什么,都不会改变你自己原来最初的样子,你还会是原来的那个自己,单纯而美好。
日升日落,总有黎明,虽未天晴,但依旧要为困境中不曾迷失的自己而点赞!为不被岁月蒙尘,依旧保持内心纯粹善良的自己点赞!为那些跟我一样经历着本质相同但表现形式各不相同幻境中的同行者们点赞!我们很弱小很无助,有苦说不出,但我们活得有骨气有尊严(无论遭遇到什么)!!!
我还是从前那个少年,没有一丝丝改变,时间只不过是考验,种在心中信念丝毫未减,眼前这个少年,还是最初那张脸,面前再多艰险不退却,每次走过,都是一次收获,过去的,就让它过去吧,别管那是一个玩笑还是谎话,路在脚下,其实并不复杂,只要记得你是你呀。。。
逆境清醒
2023.4.18
🦄 二、直方图均衡化概念
图像直方图是反映图像像素分布的统计表,横坐标代表像素值的取值区间,纵坐标代表每一像素值在图像中的像素总数或者所占的百分比。
灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。
直方图均衡化是一种简单有效的图像增强技术。根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。
直方图均衡化是将原始图像通过函数变换,调控图像的灰度分布,得到直方图分布合理的新图像,以此来调节图像亮度、增强动态范围偏小的图像的对比度。
直方图均衡化是一种经典的图像处理算法,用以改善图像的亮度和对比度。
图像直方图均衡化目的:使其原本分布集中的像素值,均衡的分布到所有可取值的范围,这样,图像就既有明亮也有灰暗,对比度和亮度就得到了改善。也就是说通过直方图均衡化对图像进行非线性拉伸,重新分配图像像素值,本质上是根据直方图对图像进行线性或非线性灰度变换。
直方图均衡化的基本思想:对图像中占比大的灰度级进行展宽,而对占比小的灰度级进行压缩,使图像的直方图分布较为均匀,扩大灰度值差别的动态范围,从而增强图像整体的对比度。
因此,在人眼视觉里,经过直方图均衡化的图像会比没有经过处理的图像更加清晰,换句话说,也就是对于一组相同构图的图像而言,直方图均匀分布的图像视觉效果会比较好。
例如,直方图均衡化可以把原始图像的直方图调整到均匀分布,增加像素之间灰度值差别的动态范围,从而增强图像整体的对比度。
通过累积分布函数(cumulative distribution function, CDF)可以实现将原图像 r 的分布转换成 s 的均匀分布,累计分布函数(CDF)就是是概率密度函数(probability density function, PDF)的积分。
实现直方图均衡的转换函数:
(1)计算原始灰度图像的直方图;
(2)通过直方图累加计算原始图像的累计分布函数 CDF;
(3)基于累计分布函数 CDF,通过插值计算得到新的灰度值。
原理公式(摘自网络):
直方图均衡化流程及示例:
直方图均衡化可以看作是一种映射,对原图中的像素点施加映射使其转换为图。在直方图均衡化中,我们保持像素值的单调性,即:
其中和为中的像素值,和为中的像素值。由和之间的像素值是一一对应且单调的,可以得出:
即区间中的像素数和区间中的像素数是相等的。因此,每个对应的像素值的累积概率函数是相等的:
我们希望映射后的图直方图分布是均衡的,即是理想情况下,图中像素值的概率分布是服从均匀分布的,即,则:
这样我们就得到了实现均衡化的映射方式。
OpenCV 函数 cv2. equalizeHist 可以实现直方图均衡化
img1=cv2.qualizeHist(imgsrc[, dst])
参数说明:
- imgsrc:输入图像
- dst:返回值,输出图像,直方图均衡化
🦄 三、直方图均衡化实例
(1)、灰度图像的均衡处理实例
①、卡通人物灰度图像均衡处理
导入模块
#-*- coding: UTF-8 -*-
import cv2
from matplotlib import pyplot as plt
import numpy as np
加入中文显示指引(防止中文字符显示异常,出现白方块的情况)
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
导入图片,src是原图,img是以单通道灰度图像形式导入图片
src=cv2.imread("girl2b.jpg")
img=cv2.imread("girl2b.jpg",0)
绘制直方图
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure()
plt.title("灰度图像图像直方图")
plt.xlabel("Bins像素值的取值区间")
plt.ylabel("每一像素值在图像中的像素总数")
plt.plot(hist)
plt.xlim([0,256])
plt.show()
同时绘制原图和经过均衡化处理后的图片做对比
eq=cv2.equalizeHist(img)
cv2.imshow("原图 直方图均衡化",np.hstack([img,eq]))
完整源代码:
#-*- coding: UTF-8 -*-
import cv2
from matplotlib import pyplot as plt
import matplotlib as mpl
import numpy as np
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
src=cv2.imread("girl2b.jpg")
img=cv2.imread("girl2b.jpg",0)
hist=cv2.calcHist([img],[0],None,[256],[0,256])
plt.figure()
plt.title("灰度图像图像直方图")
plt.xlabel("Bins像素值的取值区间")
plt.ylabel("每一像素值在图像中的像素总数")
plt.plot(hist)
plt.xlim([0,256])
plt.show()
eq=cv2.equalizeHist(img)
cv2.imshow("原图 直方图均衡化",np.hstack([img,eq]))
cv2.waitKey(0)
运行效果:
②、卡通猫头鹰灰度图像均衡处理
导入模块
#-*- coding: UTF-8 -*-
import cv2
from matplotlib import pyplot as plt
import numpy as np
加入中文显示指引(防止中文字符显示异常,出现白方块的情况)
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
导入图片,以单通道灰度图像形式导入图片
img = cv2.imread(r'bird1.png', cv2.IMREAD_GRAYSCALE)
绘制直方图
equ = cv2.equalizeHist(img)
plt.figure("原图")
plt.hist(img.ravel(), 256)
plt.figure("直方图均衡化")
plt.hist(equ.ravel(), 256)
plt.show()
cv2.imshow('原图', img)
cv2.imshow('直方图均衡化', equ)
完整源代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
img = cv2.imread(r'bird1.png', cv2.IMREAD_GRAYSCALE)
equ = cv2.equalizeHist(img)
plt.figure("原图")
plt.hist(img.ravel(), 256)
plt.figure("直方图均衡化")
plt.hist(equ.ravel(), 256)
plt.show()
cv2.imshow('原图', img)
cv2.imshow('直方图均衡化', equ)
plt.show()
cv2.waitKey(0)
运行效果:
原图和原图直方图:
原图 | 原图直方图 |
原图经直方图均衡化后的效果和经均衡化处理后的图像的直方图:
原图经直方图均衡化后的效果 | 经均衡化处理后的图像的直方图 |
③、弹琴猫灰度图像均衡处理
完整源代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
img = cv2.imread("cat1a.png", flags=0)
img1 = cv2.equalizeHist(img)
fig = plt.figure(figsize=(7,7))
plt.subplot(221), plt.title("原始图像"), plt.axis('off')
plt.imshow(img, cmap='gray', vmin=0, vmax=255)
plt.subplot(222),plt.title("均衡化后的图像"), plt.axis('off')
plt.imshow(img1, cmap='gray', vmin=0, vmax=255)
histImg, bins = np.histogram(img.flatten(), 256)
plt.subplot(223, yticks=[]), plt.bar(bins[:-1], histImg)
plt.axis([0,255,0,np.max(histImg)])
plt.title("原始图像的直方图"), plt.axis([0,255,0,np.max(histImg)])
histEqu, bins = np.histogram(img1.flatten(), 256)
plt.subplot(224, yticks=[]), plt.bar(bins[:-1], histEqu)
plt.title("均衡图像直方图"), plt.axis([0,255,0,np.max(histImg)])
plt.show()
运行效果图:
(2)、彩色图像的均衡处理实例
这里有一张猫咪弹吉他的图片,色调偏蓝,不够清晰:
我们把这张图片的直方图打印出来看看:
我们可以将彩色图像分解成三个颜色通道,然后在一个直方图中显示三种颜色的情况
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread("cat1b.jpg")
colors=cv2.split(img)
colorsNys=("b","g","r")
for(color,colorsNy) in zip(colors,colorsNys):
hist=cv2.calcHist([color],[0],None,[256],[0,256])
plt.plot(hist,color=colorsNy)
plt.xlim([0,256])
plt.show()
运行效果:
我们可以看到直方图显示这幅图像的颜色分布不均匀,
如果我们对这副彩色图像采取均衡处理,效果如何呢?
彩色图像的均衡处理方法,是将图像颜色分解后按各自颜色的分布函数处理。
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams["font.sans-serif"]=["SimHei"]
mpl.rcParams["axes.unicode_minus"]=False
img0 = cv2.imread("cat1b.jpg", -1)
img = cv2.imread("cat1b.jpg", 1)
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
result = cv2.merge((bH, gH, rH))
cv2.imshow("原图", img0)
cv2.imshow("均衡化后的图像", result)
cv2.waitKey(0)
plt.show()
运行效果:
原图 | 均衡化处理后的图 |
均衡化处理后的图像视觉效果得到改善
t经均衡化处理后的图像的直方图如下:
🦄 四、总结
如果我们碰到图片视觉效果不佳,例如灰蒙蒙的,很多细节性的东西都看不太清。这时,我们可以通过直方图均衡化的方法调整图片视觉效果。
方法是:首先画一下它的直方图,来看一下像素分布情况。通常效果不佳的图像,大部分在灰度值较高的部分,而且分布很集中。这时我们可以通过图像的均衡处理,即将图像颜色分解后按照灰度的累积分布函数处理或按各自颜色的分布函数处理。直方图均衡化处理后的直方图分布比较分散,能够涵盖整个x轴。图片视觉效果得到改善。
直方图均衡化的作用:增强图像数据的对比度有利于特征的提取,直方图均衡化可以自动调整图像的对比度。不论是从肉眼还是算法来看都有帮助。
直方图实例详解(颜色直方图、灰度直方图)
推荐阅读:
计算机视觉__基本图像操作(显示、读取、保存) | 直方图(颜色直方图、灰度直方图) | 直方图均衡化(调节图像亮度、对比度) |