小白入门计算机视觉(四):图像基本处理----直方图(Histogram)

更新时间:2023-07-20 17:57:59 阅读: 评论:0

⼩⽩⼊门计算机视觉(四):图像基本处理----直⽅图(Histogram)
⽂章⽬录
认识直⽅图
在图像处理中,也经常需要分析图像的亮度(即像素级的分布情况),这就需要⽤到直⽅图了,如颜⾊直⽅图、灰度直⽅图等。
颜⾊直⽅图
颜⾊直⽅图是最常⽤的表达颜⾊特征的⽅法,其优点是不受图像旋转和平移变化的影响,进⼀步借助归⼀化还可以不受图像尺度变化的影响,其缺点是没有表达出颜⾊空间分布的信息。
颜⾊直⽅图处理⽅法
冬天的梦
颜⾊直⽅图是对RGB三通道分别做统计,这个逻辑⽐较简单,我直接⽤opencv的函数来实现吧,先看代码:
import cv2
import numpy as np
from matplotlib import pyplot as plt
image = cv2.imread("data.jpg")
cv2.imshow("Original",image)
#cv2.waitKey(0)
chans = cv2.split(image)
colors =("b","g","r")
plt.figure()
plt.title("Flattened Color Histogram")
plt.xlabel("Bins")
plt.ylabel("# of Pixels")
城乡二元经济结构
for(chan,color)in zip(chans,colors):
hist = cv2.calcHist([chan],[0],None,[256],[0,256])
plt.plot(hist,color = color)
plt.xlim([0,256])
plt.show()
还拿以前⽼照⽚做实验吧。如下图所⽰(只是统计RGB的整体⾊调级的分布情况,没有位置信息):
颜⾊直⽅图
图中三条不同颜⾊的曲线分别代表着各⾃通道的⾊调分布
灰度直⽅图
图像的灰度直⽅图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横 坐标是灰度级,纵坐标是该灰度级出现的频率,描述了图像中灰度分布情况,能够很直观的展⽰出图像中各个灰度级所 占的多少。
灰度直⽅图处理⽅法
灰度直⽅图的处理相⽐颜⾊直⽅图更加简单,因为他只是对灰度图的灰度级别做分布统计,还是⽤同⼀张图⽚吧
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("data.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#cv2.imshow("image_gray", gray)
# 灰度图像的直⽅图,⽅法⼀
plt.figure()
plt.hist(gray.ravel(),256)
plt.show()
如下路所⽰:
从这两个直⽅图中我们也可以看出,不管是颜⾊直⽅图还是灰度直⽅图,直⽅图中所表达出的图像亮度信息都⼏乎是相同的
直⽅图性质
1. 从上⾯的图中我们也可以看到,直⽅图⾥并没有显⽰位置信息,仅仅是反映了图像中的灰度分布规律和每个灰度级具有的像素个数,
并不受旋转和平移的影响
2. 任何⼀幅特定的图像都有唯⼀的直⽅图与之对应,但不同的图像可以有相同的直⽅图教育常识
这个应该好理解,因为直⽅图⾥忽略了位置信息,所以不同的图⽚的直⽅图可能会相同,我们举个例⼦,⽐如⼀张4*4的图⽚,我们假设⿊⽩的像素点是相同的,我们把像素坐标调换⼀下,直⽅图还是不会变的,但是图⽚却变了
3. 如果⼀幅图像有两个不相连的区域组成,并且每个区域的直⽅图已知,则整幅图像的 直⽅图是该两个区域的直⽅图之和
直⽅图的应⽤
直⽅图可以很直观的看出图像的亮暗程度
如上图所⽰,直⽅图可以直观的看到图像的像素级的分布情况,能够直观的了解到图像的亮度信息
直⽅图均衡化
直⽅图均衡化的⽬的
姘头是什么意思
有时候我们拿到的图像要么偏亮,要么偏暗,就会影响计算机的判断,直⽅图均衡化的⽬的就是使图像增强
直⽅图均衡化就是将原图像的直⽅图通过变换函数变为均匀的直⽅图,然后按均匀直⽅图修改原图像,从⽽获得⼀幅灰度分布均匀的新图像(注意这⾥的均匀不是平均)。直⽅图均衡化就是⽤⼀定的算法使直⽅图⼤致平和的⽅法
为了将原图像的亮度范围进⾏扩展,需要⼀个映射函数,将原图像的像素值均衡映射到新直⽅图中,这个映射函数有两个条件:
1.为了不打乱原有的顺序,映射后亮、暗的⼤⼩关系不能改变
2.映射后必须在原有的范围内,⽐如(0-255)
步骤
1.依次扫描原始灰度图像的每⼀个像素,计算出图像的灰度直⽅图H
转让权2.计算灰度直⽅图的累加直⽅图
3.根据累加直⽅图和直⽅图均衡化原理得到输⼊与输出之间的映射关系。
4.最后根据映射关系得到结果:dst(x,y)=H’(src(x,y))进⾏图像变换
映射公式
对于输⼊图像的任意⼀个像素p,p∈[0,255],总能在输出图像⾥有对应的像素q,q∈[0,255]使得下⾯等式成⽴(输⼊和输出的像素总量相等)
其中,输出图像每个灰度级的个数:
我们将公式(2)代⼊公式(1)
那么均衡化后的对应的像素点的像素值
我举个例⼦:现有⼀个亮度很暗的4*4的图像,像素值如下:
我们从像素值就能看出这个图像⼏乎是⼀⽚⿊,⾁眼⼏乎是看不清任何图像信息的,现在我们套⽤上⾯的公式进⾏计算:
均衡化后的对应的像素点的像素值为:
单从像素值来看,是不是要⽐原始图像亮度更加亮⼀些呢,并且像素点之间的差别也可以⾁眼分辨出来了
拿张下⾯的图⽚做个实验
先看原图的灰度图吧
import  cv2
# 获取灰度图像
img = cv2.imread ("data3.png", 1)
gray = cv2.cvtColor (img , cv2.COLOR_BGR2GRAY )
cv2.imwrite ("data3gray.png",gray )
三严三实教育cv2.imshow ("image_gray", gray )
原图像的灰度图
然后直接调⽤opencv库的直⽅图均衡化函数对上⾯的灰度图做直⽅图均衡化
import  cv2
# 灰度图像直⽅图均衡化
dst = cv2.equalizeHist (gray )
# 直⽅图
hist = cv2.calcHist ([dst ],[0],None ,[256],[0,256])
cv2.imwrite ("data3hist.png",dst )
cv2.imshow ("Histogram Equalization", dst )
cv2.waitKey (0)
hist (k )=∑k =0p input hist (k )      (1)
∑k =0q output hist (k )≈output ,k ∈256H ∗W
[0,255]              (2)
hist (k )≈∑k =0p input (q +1)256
H ∗W q =∗∑k =0p H ∗W hist (k )
input 256−1
直⽅图均衡化处理后灰度图
可以很明显的看到经过直⽅图均衡化后的图像要⽐愿图像的灰度图清晰的多
再对原图做个颜⾊直⽅图均衡化处理,需要将三个通道分别直⽅图均衡化处理再合并三个通道进⾏合并import cv2
# 彩⾊图像直⽅图均衡化
img = cv2.imread("data3.png",1)
cv2.imshow("src", img)
# 彩⾊图像均衡化,需要分解通道对每⼀个通道均衡化
康诰(b, g, r)= cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每⼀个通道
result = ((bH, gH, rH))
cv2.imwrite("data3rgbhist.png",result)
郭文珺
cv2.imshow("dst_rgb", result)
cv2.waitKey(0)
颜⾊图像直⽅图均衡化后的图像
虽然图像的颜⾊和原图相⽐发⽣了变化,但是从图像信息来看,是不是增强了很多呢

本文发布于:2023-07-20 17:57:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1089389.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   像素   灰度   分布   灰度级   均衡化   信息   亮度
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图