图像点运算
定义:
对图像中的每个像素进行灰度变换运算。
输出图象每个象素点的灰度值仅由输入图像相同位置象素点的灰度值决定。
设输入图像和输出图像在 ( x , y ) (x,y) (x,y)处的灰度值分别是 r r r 和 s s s,则点运算可表示为 s = T ( r ) s = T(r) s=T(r), T T T 表示输入图像与输出图像像素的灰度映射关系。
运算的用途:实现对比度增强等。
图像的点运算包括:
- 灰度变换
- 线性变换
- 非线性变换(对数变换、伽马变换、阈值变换,分段线性变换等)
- 位图切割
线性点运算
输出输入的灰度值成线性函数关系: s = f ( r ) = a r + b s =f(r)=ar+b s=f(r)=ar+b
-
a a a 控制对比度(不同级别灰度的明暗差异):
- a > 1,对比度变大;
- a < 1,对比度变小。
- a 为负值,实现负片效果
-
b 控制输出图像的整体亮度:
- b > 0 增大亮度
- b < 0 则减小亮度
Code
import cv2 as cv
import numpy as np
# 线性变换
def linear(img,a,b):
"""
s =f(r)=ar+b
"""
r = np.copy(img)
s = a*r+b
return s
if __name__=="__main__":
img = cv.imread("3.png")
img = cv.cvtColor(img,cv.COLOR_RGB2GRAY)
# 调节 a,b值观察图像变化
a = 1
b = 255
re_img = linear(img,a,b)
cv.imshow('img',img)
cv.imshow('re_img,a={},b={}'.format(a,b),re_img)
cv.waitKey(0)
cv.destroyAllWindows()
灰度的线性变换不利于突出感兴趣区域,且容易出现饱和、截止等情况。
灰度的非线性变换:对数变换
灰度的线性变换不利于突出感兴趣区域,且容易出现饱和、截止等情况。解决办法是对进行非线性变换。
灰度对数变换:可增强暗部细节:
s
=
c
l
o
g
(
1
+
r
)
c
为
常
数
,
建
议
值
c
=
255
/
l
o
g
(
256
)
s = clog(1+r)\\ c为常数,建议值c = 255/log(256)
s=clog(1+r)c为常数,建议值c=255/log(256)
灰度反对数变换:可增强亮部细节:
s
=
e
x
p
(
r
/
c
)
−
1
s = exp(r/c) - 1
s=exp(r/c)−1
灰度的非线性变换:伽马变换
伽马变换又称为 幂律变换:
s
=
c
r
γ
,
c
≥
0
,
γ
≥
0
;
实
际
使
用
公
式
:
s
=
255
×
(
r
255
+
e
p
s
)
γ
s = cr^\gamma ,c\geq0,\gamma\geq0;\\ 实际使用公式:s = 255\times(\frac{r}{255+eps})^\gamma
s=crγ,c≥0,γ≥0;实际使用公式:s=255×(255+epsr)γ
e p s eps eps 为补偿系数(一般为0)
γ \gamma γ 为伽马系数
γ < 1 \gamma<1 γ<1 时,低亮度区域对比度增强
γ < 1 \gamma<1 γ<1 时, 高亮度区域对比度增强
Code
# 非线性变化:γ变换
def gamma(img,gamma):
"""
s = c * r^gamma
"""
r = np.copy(img)
s = np.power(r/255,gamma)
return s
灰度的非线性变换:对比拉伸
在实际应用中,为了突出图像中感兴趣的研究对象,常常要求增强某一灰度范围的对比度,或对不同范围的灰度值进行不同的处理,即分段线性拉伸。分段线性拉伸是仅将某一范围的灰度值进行拉伸,而其余范围的灰度值实际上被压缩了。
Code
# 非线性变化:对比拉伸
def constr(img):
"""
s = 0.2*r r<90
s = 3*r 90<r<160
s = 0.8*r 其他
"""
r = np.copy(img)
row,col = r.shape
for i in range(row):
for j in range(col):
if r[i][j] < 90:
r[i][j] *=0.2
if r[i][j] > 90 and r[i][j] < 160:
r[i][j] *= 3
if r[i][j] > 160:
r[i][j] *= 0.8
return r
灰度的非线性变换: S形灰度变换
S 形灰度变换曲线,降低较亮和较暗部分的对比度,加强中间灰度级物体对比度:
s
=
255
2
{
1
+
1
s
i
n
(
a
π
2
)
s
i
n
[
a
π
(
r
255
−
1
2
)
]
}
s = \frac{255}{2}\{1+\frac{1}{sin(a\frac{\pi}{2})}sin[a\pi(\frac{r}{255}-\frac{1}{2})]\}
s=2255{1+sin(a2π)1sin[aπ(255r−21)]}
S 形灰度变换曲线,加强较亮和较暗部分的对比度,降低灰度级中间物体对比度:
s
=
255
2
{
1
+
1
t
a
n
(
a
π
2
)
t
a
n
[
a
π
(
r
255
−
1
2
)
]
}
s = \frac{255}{2}\{1+\frac{1}{tan(a\frac{\pi}{2})}tan[a\pi(\frac{r}{255}-\frac{1}{2})]\}
s=2255{1+tan(a2π)1tan[aπ(255r−21)]}
灰度的非线性变换:阈值变换
阈值变换可以将灰度图像转换成黑白二值图像,用户指定一阈值T,灰度低于T置0,高于T置255。
s
=
{
0
,
r
<
T
255
,
r
≥
T
s = \begin{cases} 0,& r<T\\ 255,& r\geq T \end{cases}
s={0,255,r<Tr≥T
通过阈值变换有助于进行图像分割。
Code
# 非线性变化:阈值变换
def threshold(img,T):
r = np.copy(img)
r[r>T] = 255
r[r<T] = 0
return r
灰度的非线性变换:灰度切割
灰度切割(灰度分层):突出感兴趣灰度范围
—