(1)图像灰度非线性变换:DB=DAXDA/255
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img=cv2.imread('luo.png')
#图像灰度转换
grayimage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#获取图像的高度和宽度
heigh=grayimage.shape[0]
width=grayimage.shape[1]
#创建一副图像
result=np.zeros((height,width),np.uint8)
#图像灰度非线性变换:DB=DAXDA/255
for i in range(height):
for j in range(width):
gray=int(grayimage[i,j])*int(grayimage[i,j])/255
result[i,j]=np.uint8(gray)
#显示图像
cv2.imshow('Grayimage',grayimage)
cv2.imshow('Result',result)
#等待结果
cv2.waitKey(0)
cv2.destoryAllWindows()
(2)图像灰度对数变换
DB=c X Log(1+DA)
由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。这种变换可用于增强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素。(实现了扩展低灰度值而压缩高灰度值的效果)
import cv2
import numpy as np
import matplotlib.pyplot as plt
#绘制曲线
def log_plot(c):
x=np.arange(0,256,0.01)
y=c*np.log(1+x)
plt.plot(x,y,'r',linewidth=1)
plt.rcParams['font.sans-serif']=['SimHei']#正常显示中文标签
plt.title('对数变换函数’)
plt.xlable('x')
plt.ylable('y')
plt.xlim(0,255),plt.ylim(0,255)
plt.show()
#对数变换
def log(c,img):
output=c*np.log(1+img)
output=np.uint8(output+0.5)
return output
#读取原始图像
img=cv2.imread('dark.png')
#绘制对数变换曲线
log_plot(42)
#图像灰度对数变换
output=log(42,img)
#显示图像
cv2.imshow('Input', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
(3)图像灰度伽玛变换
伽玛变换又称为指数变换或幂次变换,DB=c X DA^r
1.当 r>1 时,会拉伸图像中灰度级较高的区域,压缩灰度级较低的部分(曝光图片,光线较亮)
2.当 r<1 时,会拉伸图像中灰度级较低的区域,压缩灰度级较高的部分
3.当 r=1 时,该灰度变换是线性的,此时通过线性方式改变原图像
import cv2
import numpy as np
import matplotlib.pyplot as plt
#绘制曲线
def gamma_plot(c, v):
x = np.arange(0, 256, 0.01)
y = c*x**v
plt.plot(x, y, 'r', linewidth=1)
plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文标签
plt.title('伽马变换函数')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim([0, 255]), plt.ylim([0, 255])
plt.show()
#伽玛变换
def gamma(img, c, v):
lut = np.zeros(256, dtype=np.float32)
for i in range(256):
lut[i] = c * i ** v
output_img = cv2.LUT(img, lut) #像素灰度值的映射
output_img = np.uint8(output_img+0.5)
return output_img
#读取原始图像
img = cv2.imread('white.png')
#绘制伽玛变换曲线
gamma_plot(0.00000005, 4.0)
#图像灰度伽玛变换
output = gamma(img, 0.00000005, 4.0)
#显示图像
cv2.imshow('Imput', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
(1)图像阈值化
图像阈值化可以理解为一个简单的图像分割操作,阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的像素点使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。图像阈值化(Binarization)旨在剔除掉图像中一些低于或高于一定值的像素,从而提取图像中的物体,将图像的背景和噪声区分开来。
阈值化处理灰度图,将图像中的像素划分为两类颜色0/255
opencv库中提供固定阈值化函数threshold() 和自适应阈值化函数adaptiveThreshold()
(2) 阈值化处理
import cv2
import numpy as np
#读取图片
src=cv2.imread('luo.png')
#灰度图像处理
grayimage=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
#二进制阈值化处理,像素值大于 127 的设置为 255,小于等于 127 设置为0
r1,b1=cv2.threshold(grayimage,127,255,cv2.THRESH_BINARY)
#反二进制阈值化处理
r2, b2= cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY_INV)
#截断阈值化处理,<127原像素展示,>127 127展示
r3, b3 = cv2.threshold(grayImage, 127, 255, cv2.THRESH_TRUNC)
#阈值化为 0 处理,>127原像素展示,<127 0展示
#反阈值化为 0,>127为0,<127 原像素展示cv2.THRESH_TOZERO_INV
r4, b4 = cv2.threshold(grayImage, 127, 255, cv2.THRESH_TOZERO)
#显示图像
cv2.imshow('src',src)
cv2.imshow('result',b1)
cv2.imshow("result", b2)
cv2.imshow("result", b3)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()
(3)自适应阈值化处理
根据图像上的每一个小区域,计算与其对应的阈值,从而使得同一幅图像上的不同区域采用不同的阈值,在亮度不同的情况下得到更好的结果
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#读取图像
img=cv2.imread('miao.png')
#图像灰度化处理
grayimage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#固定阈值化处理
r,thresh1=cv2.threshold(grayimage,127,255,cv2.THRESH_BINARY)
#自适应阈值化处理 方法一
thresh2 = cv2.adaptiveThreshold(grayimage, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
#自适应阈值化处理 方法二
thresh3 = cv2.adaptiveThreshold(grayimage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
#设置字体
matplotlib.rcParams['font.sans-serif']=['SimHei']
#显示图像
titles= ['灰度图像', '全局阈值', '自适应平均阈值', '自适应高斯阈值']
images=[grayimage,thresh1,thresh2,thresh3]
for i in range(4):
plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.title(title[i])
plt.xticks([]),plt.yticks([])
plt.show()