背景
这一章主要讨论两类空间域处理方法:** 亮度变换和空间滤波**。
空间域处理的表达式为
g
(
x
,
y
)
=
T
[
f
(
x
,
y
)
]
g(x, y) = T[f(x, y)]
g(x,y)=T[f(x,y)]
灰度变换函数
在灰度图中每个像素的值代表该点灰度,因此灰度变换可以表示为
s
=
T
(
r
)
s = T(r)
s=T(r)
函数imadjust
和stretchlim
在matlab里的亮度调整函数为imadjust
。使用方式是:
g = imadjust(f, [low_in high_in], [low_out high_out], gamma)
stretchlim
用于发现图像中用以拉伸对比度的范围,使用方式是
Low_High = stretchlim(f)
Python实现
imadjust
函数
根据imadjust
函数的性质,大概推测其函数
设
r ′ = r − l o w i n h i g h i n − l o w i n r' = \frac{r - low_{in}}{high_{in} - low_{in}} r′=highin−lowinr−lowin
T ( r ) = { h i g h o u t r > h i g h i n ( h i g h o u t − l o w o u t ) r ′ g a m m a + l o w o u t l o w i n < r < = h i g h i n l o w o u t r < l o w i n T(r) = \left\{ \begin{aligned} high_{out} & & r > high_{in} \\ (high_{out} - low_{out})r'^{gamma} + low_{out} & & low_{in} <r <= high_{in} \\ low_{out} & & r < low_{in} \end{aligned} \right. T(r)=⎩⎪⎨⎪⎧highout(highout−lowout)r′gamma+lowoutlowoutr>highinlowin<r<=highinr<lowin
因此代码实现为:
def imadjust(img, inLim, outLim, gamma = 1):
img = img.astype(np.float64) / 255
high = img > inLim[1]
low = img < inLim[0]
r_ = (img - inLim[0]) / (inLim[1] - inLim[0])
img_ = (outLim[1] - outLim[0]) * (r_ ** gamma) + outLim[0]
img_[high] = outLim[1]
img_[low] = outLim[0]
return (img_ * 255).astype(np.uint8)
def stretchlim(img):
low = float(np.min(img))
high = float(np.max(img))
return (low / 255, high / 255)
这里需要注意的是,读入的灰度图的数据格式为uint8,首先要将其转换为 [ 0 , 1 ] [0, 1] [0,1]的浮点数进行运算。
直方图处理与函数绘图
生成直方图
在matlab直方图工具箱中,核心直方图函数是imhist(f, b)
用法为:
h = imhist(f, b);
h为返回的灰度直方图结果。
直方图均衡
在matlab中,可以使用histeq(f, nlev)
进行直方图均衡。
g = histeq(f, nlev);
nlev是为输出图像设定的灰度级数,默认为64,一般上设置为256 。
Python实现
在Python中实现直方图生成、均衡可以使用Opencv中自带的函数calcHist()
和equalizeHist()
。
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]])
images
为输入的图像。channels
为所需要计算的通道数量。mask
为掩膜(为和图像大小一样的矩阵,矩阵的值0为不需要处理、1为需要处理,None为默认处理全图)。histSize
将灰度分为多少层,一般为256。ranges
像素值的范围,一般为[0,255]表示0~255。
cv2.equalizeHist(img)
直接将图像灰度均衡化。
需要注意的是equalizeHist的输入必须是灰度图,否则会报错。
直方图匹配
占坑