什么是图像的灰度变换
图像的 灰度变换,简单一点就是输入一个图像 f ( x , y ) f(x,y) f(x,y),讲过变换后输出另一个图像 g ( x , y ) g(x,y) g(x,y),关键是我们如何变换。图像的变换本质上是图像像素值的变换。 举个简单的例子,我们现在需要将一张灰度图像变亮,那么我们可以将灰度图像的每个像素值加20(加多少自己决定),即可得到像素的变换方式 g ( x , y ) = f ( x , y ) + 20 g(x,y)=f(x,y)+20 g(x,y)=f(x,y)+20如果我们不想像素值直接相加,那么我们可以用灰度图像的像素值乘以2,即: g ( x , y ) = 2 ∗ f ( x , y ) g(x,y)=2*f(x,y) g(x,y)=2∗f(x,y)图像的灰度变换,核心是找到变换方式,表示如下: g ( x , y ) = F ( f ( x , y ) ) g(x,y)=F(f(x,y)) g(x,y)=F(f(x,y))借用函数的定义: y = F ( x ) x ⊂ ( 灰度图像的像素值 ) y=F(x) \quad x\subset(灰度图像的像素值) y=F(x)x⊂(灰度图像的像素值)
图像反转
对灰度图像的反转,其实就是对灰度图像像素值的反转,图像像素值的取值范围是
(
0
,
255
)
(0,255)
(0,255),那么对像素值(用
f
(
x
,
y
)
f(x,y)
f(x,y)表示)反转只需要
255
−
f
(
x
,
y
)
255-f(x,y)
255−f(x,y),即:
g
(
x
,
y
)
=
255
−
f
(
x
,
y
)
g(x,y)=255-f(x,y)
g(x,y)=255−f(x,y)单个像素的变化效果如下:
上图绘制的代码如下:
import numpy as np
import matplotlib.pyplot as plt
if __name__ =='__main__':
# 定义 x 的范围
x = np.arange(0, 256)
# 定义函数
P = x # log变换之前的像素值
PN = 255 - x # log变换之后的像素值
# 绘制图像
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10, 5))
plt.plot(x, P, label='反转之前', color='blue')
plt.plot(x, PN, label='反转之后', color='red')
plt.xlabel('原图像单个像素值')
plt.ylabel('反转后的图像单个像素值')
plt.title('图像反转:对图像的每个像素的值进行操作(255 - pixel)')
plt.legend()
plt.grid(True)
plt.xlim(0, 255) # 设置 x 轴的范围
plt.ylim(0, 255) # 设置 y 轴的范围
plt.savefig("image/tmp.png")
plt.show()
实例
话不多说,我们直接看图像反转的实例和真实效果,下面实例取自 数字图像处理(冈萨雷斯)第四版
图像反转代码
import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
if __name__ =='__main__':
# 读取灰度像,此处正对灰度图像的变换
imgGray = cv.imread('Image/Fig0101.tif',0)
rows,cols = imgGray.shape[:2]
imgTransform = np.zeros_like(imgGray)
for row in range(rows):
for col in range(cols):
imgTransform[row,col] = 255 - imgGray[row,col]
# 显示图像
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(10, 10))
plt.subplot(121)
plt.imshow(cv.cvtColor(imgGray, cv.COLOR_BGR2RGB))
plt.axis('off')
plt.title('Original Image')
plt.subplot(122)
plt.imshow(cv.cvtColor(imgTransform, cv.COLOR_BGR2RGB))
plt.axis('off')
plt.title('Transformed Image')
plt.tight_layout()
plt.savefig('Image/Fig0101.png', transparent=True)
plt.show()
图像反转的效果
上面例子中,原图像是乳房的X射线数字照片,其中显示了一块小病变,尽管两幅图的内容看起来无差别,但是有些观察者发现使用反转图像更容易分析乳腺组织的细节。