一、图像灰度变换(点运算)
线性点运算
利用线性方程s=ar+b来完成对图像的点运算,s为输出灰度值,r 为输入灰度值,a 和b 为变换系数。
通过调整a和b的取值,可以得到不同的变换效果:
- 当a=1,b=0时,输入和输出相等,即输出原图像。
- 当a=1,b>0时,输出灰度值变大,图像整体变亮。
- 当a=1,b<0时,输出灰度值变小,图像整体变暗。
- 当a>1时,输出图像对比度增大。
- 当0<a<1时,输出图像对比度减小。
- 当a<0时,图像暗区变亮,亮区变暗,完成图像求补
我们来看一下例子:
import matplotlib.pyplot as plt
import cv2
import numpy as np
img=cv2.imread('1.bmp',0)
a,b=1,0
img1=cv2.add(cv2.multiply(1,img),b)
plt.subplot(231),plt.imshow(img1,'gray')
plt.title('a=1,b=0')
a=1
b=50
img2=cv2.add(cv2.multiply(a,img),b)
plt.subplot(232),plt.imshow(img2,"gray")
plt.title('a=1,b=50')
a,b=1,-50
img3=cv2.add(cv2.multiply(a,img),b)
plt.subplot(233),plt.imshow(img3,'gray')
plt.title('a=1,b=50')
a,b=1.5,0
img4=cv2.add(cv2.multiply(a,img),b)
plt.subplot(234),plt.imshow(img4,'gray')
plt.title('a=1.5,b=0')
a,b=0.3,0
img5=cv2.add(cv2.multiply(a,img),b)
plt.subplot(235),plt.imshow(img5,'gray')
plt.title('a=0.3,b=0')
a,b=-1,0
img6=cv2.add(cv2.multiply(a,img),b)
plt.subplot(236),plt.imshow(img6,'gray')
plt.title('a=-1,b=0')
plt.show()
该代码对以上六种情况都做了实际操作,关键在于如何在原图像上进行线性运算得到新的图像,课本中用了cv2库中的add函数,但这样有一个问题:图像数据通常是以 uint8 格式存储的,其取值范围是 0 到 255,当 a 和 b 的值使得图像中的某些像素值超出这个范围时,就会引发溢出错误。于是在这里我用cv2.convertScaleAbs函数,该函数可以对图像进行缩放和平移操作,并且会自动处理溢出问题。(注:也可以使用归一化处理img=img/255)

另外在plt.imshow函数中需要表明输出图像为灰度,否则即使将img强制转化为了灰度图仍会输出彩色图,类似于这样:

非线性点运算
非线性点运算有两种,分别是对数运算和幂次运算。其中幂次变换比对数变换更加复杂。于是我们便用幂次变化对图像进行处理。
指数方程为s=cr**γ ,s为输出灰度值,r 为输入灰度值,c 和γ 为正常数,γ 值以1为分界线,当值大于1时,可以产生和对数运算相同的结果,即将灰度值低的区域进行扩展,灰度值高的区域进行压缩,提高图像亮度;当γ 值小于1时,将得到相反的结果,即灰度值高的区域进行扩展,将灰度值低的区域进行压缩,减小图像亮度;当c=γ=1是,将是简单的线性变换,输入与输出相等。
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('1.bmp',0)
img=img/255
plt.subplot(231)
plt.imshow(img,'gray')
plt.title('original')
r=0.1
plt.subplot(232)
temp=cv2.pow(img,0.1)
plt.imshow(temp,cmap='gray')
plt.title('c=1,r=0.1')
r=0.4
plt.subplot(233)
temp=cv2.pow(img,0.4)
plt.imshow(temp,cmap='gray')
plt.title('c=1,r=0.4')
r=1
plt.subplot(234)
temp=cv2.pow(img,1)
plt.imshow(temp,cmap='gray')
plt.title('c=1,r=1')
r=2.5
plt.subplot(235)
temp=cv2.pow(img,2.5)
plt.imshow(temp,cmap='gray')
plt.title('c=1,r=2.5')
r=10
plt.subplot(236)
temp=cv2.pow(img,10)
plt.imshow(temp,cmap

最低0.47元/天 解锁文章
1173

被折叠的 条评论
为什么被折叠?



