数字图像处理笔记(五):直⽅图均衡与直⽅图匹配(规定化)
1 - 直⽅图处理
直⽅图是多种空间域处理技术的基础,可以⽤于图像增强。
2 - 直⽅图均衡
考虑连续灰度值,并⽤变量r表⽰待处理图像的灰度。设r的取值区间为[0,L-1],且r = 0表⽰⿊⾊,r = L - 1表⽰⽩⾊。令和分别表⽰随机变量r和s的概率密度函数,概率密度函数归⼀化后可以画出图像的直⽅图
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread('images/test_1.jpg', 0)
hist = cv.calcHist([image],[0],None,[256],[0,255])
plt.plot(hist)
plt.show()
可以看到较暗的图⽚灰度直⽅图分布的⾮常不均衡,那么我们构造⼀个出变换
使得对应的输出图像概率密度函数变成均匀的
p (r )r p (s )s s =T (r )=(L −1)p (w )dw ,0≤∫0r
r r ≤L −1
对于离散值,我们处理其概率(直⽅图值)与求和来替代处理概率密度函数与积分。
⼀副数字图像中灰度级出现的概率近似为:
其中,MN是图像中像素的综述,是灰度为像素的个数。
则离散形式的变化公式为:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread('images/test_1.jpg', 0)
image2 = cv.equalizeHist(image)
cv.imshow("image_2",image2)
罚不责众
hist = cv.calcHist([image2],[0],None,[256],[0,255])
豆浆制作
plt.plot(hist)
plt.show()
cv.waitKey(0)
可以看到直⽅图的分布更加均匀了,图像的对⽐度和相关细节显⽰的也更加明显了。
r k p (r )=r k ,k =MN n k
0,1,2,…,L −1
n k r k s =k T (r )=k (L −1)p (r )=j =0∑k r j n ,k =MN (L −1)j =0∑k
j 0,1,2,…,L −1
孕妇可以吃驴肉不3 - 直⽅图匹配电脑用英语怎么说
直⽅图均衡能⾃动地确定变换函数,当需要⾃动增强时,这是⼀种好⽅法,因为由于这种技术得到的结果可以预知,并且这种⽅法实现也很简单,但是对于某些应⽤,采⽤均匀直⽅图的基本增强并不是最好的⽅法,有时我们希望处理后的图像具有规定的直⽅图形状可能更有⽤。这种采⽤处理后有特殊直⽅图的⽅法称为直⽅图匹配或直⽅图规定划。
例:直⽅图规定划
设⼀副图⽚的灰度概率密度函数(PDF)为我们想要寻找⼀个变换函数,使得产⽣的图像的灰度PDF是求出原图像的直⽅图均衡变换:
求出规定图像的直⽅图均衡变换:
最后使其相等利⽤反变换得到
画出函数的关系图就很好理解了
在离散形式下
对于⼀个q值,有再利⽤反变换,有那么我们总结直⽅图规定划过程如下:
p (r )=r 2r /(L −1),0≤2r ≤(L −1)
p (z )=z 3z /(L −21),0≤3r ≤(L −1)
s =T (r )=(L −1)p (w )dw =∫0r
r wdw =(L −1)2∫o r ,0≤(L −1)r 2
r ≤L −1G (z )=(L −1)p (w )dw =∫0z
z w dw =(L −1)23∫o z 2,0≤(L −1)2z 3产品运营方案
r ≤L −1G (z )=s
z =G 1[T (r )]=−G 1(s )
−s =k T (r )=k (L −1)p (r )=j =0∑k r j n ,k =MN (L −1)j =0∑k
j 0,1,2,…,L −1G (z )=q (L −1)p (z )i =0∑q
关于童趣的作文z i G (z )=q s k
汽车票退票Z =q G 1(s )
−k
1. 计算给定图像的直⽅图,并⽤它寻找直⽅图均衡变换,把四舍五⼊为范围[0,L-1]内的整数。
2. 计算变换函数G的所有值,将G的值储存在⼀个表中
3. 对于每个值,使⽤储存的G值寻找相应的值,使最接近。
4. ⾸先对输⼊图像进⾏均衡,然后使⽤步骤3找到的映射把该图像中的每个均衡后的像素值映射为直⽅图规定划后的图像相应值具体python实现:
将⼀张较为⿊暗的原始图像
与⼀张拍摄光线较好的匹配图像
进⾏直⽅图匹配,⽬的是为了把原始图像的直⽅图匹配成匹配图像的直⽅图分布,使得原始图像能够呈现出匹配图像的光线效果。import numpy as np
from matplotlib import pyplot as plt
from PIL import Image
import matplotlib
#传⼊的直⽅图要求是个字典,每个灰度对应着概率
def drawHist(hist,name):
keys = hist.keys()
values = hist.values()
x_size = len(hist)-1#x 轴长度,也就是灰度级别
axis_params = []
axis_params.append(0)
axis_params.append(x_size)
#plt.figure()
if name != None:
plt.title(name)
plt.bar(tuple(keys),tuple(values))#绘制直⽅图
#plt.show()
#将灰度数组映射为直⽅图字典,nums 表⽰灰度的数量级
def arrayToHist(grayArray,nums):
if(len(grayArray.shape) != 2):
print("length error")
return None
w,h = grayArray.shape
hist = {}
p (r )r s k z Q G (z )q s k s k z q
hist = {}
for k in range(nums):
hist[k] = 0
for i in range(w):
for j in range(h):
(grayArray[i][j]) is None):
hist[grayArray[i][j]] = 0
hist[grayArray[i][j]] += 1
#normalize
n = w*h
for key in hist.keys():
hist[key] = float(hist[key])/n
return hist
#计算累计直⽅图计算出新的均衡化的图⽚,nums为灰度数,256 def equalization(grayArray,h_s,nums):
#计算累计直⽅图
tmp = 0.0
h_acc = py()
for i in range(256):
tmp += h_s[i]
h_acc[i] = tmp
if(len(grayArray.shape) != 2):
print("length error")
return None
w,h = grayArray.shape
des = np.zeros((w,h),dtype = np.uint8)
for i in range(w):
for j in range(h):
des[i][j] = int((nums - 1)* h_acc[grayArray[i][j] ] +0.5) return des
def histMatch(grayArray,h_d):
#计算累计直⽅图
tmp = 0.0
h_acc = py()
for i in range(256):
tmp += h_d[i]
h_acc[i] = tmp
h1 = arrayToHist(grayArray,256)
tmp = 0.0
h1_acc = h1.copy()
for i in range(256):
tmp += h1[i]
h1_acc[i] = tmp
#计算映射
M = np.zeros(256)
for i in range(256):
idx = 0
minv = 1
for j in h_acc:
if (np.fabs(h_acc[j] - h1_acc[i]) < minv):
minv = np.fabs(h_acc[j] - h1_acc[i])
idx = int(j)
M[i] = idx怨天尤人的意思
des = M[grayArray]
return des
imdir = "images/test_1.jpg"#原始图⽚的路径
imdir_match = "images/persian_cat.jpg"
#直⽅图匹配
#打开⽂件并灰度化
im_s = Image.open(imdir).convert("L")
im_s = np.array(im_s)