图像运算和图像增强一
1.图像点运算之图像灰度化处理
(1)图像点运算概念
图像点运算(Point Operation)指对于一幅输入图像,将产生一幅输出图像,输出图像的每个像素点的灰度值由输入像素点决定。点运算实际上是灰度到灰度的映射过程,通过映射变换来达到增强或者减弱图像的灰度。
(2)图像灰度化处理
彩色图像包括RGB三个分量,而灰度图像就是把RGB三个分量相等的过程。灰度图像中每个像素仅具有一种样本颜色,其灰度是位于黑色与白色之间的多级色彩深度。
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img_BGR=cv2.imread('luo.png')
img_RGB = cv2.cvtColor(img_BGR,cv2.COLOR_BGR2RGB)#BGR 转换为 RGB
img_GRAY = cv2.cvtColor(img_BGR,cv2.COLOR_BGR2GRAY) #灰度化处理
img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV) #BGR 转 HSV
img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb) #BGR 转 YCrCb
img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS) #BGR 转 HLS
img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ) #BGR 转 XYZ
img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB) #BGR 转 LAB
img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV) #BGR 转 YUV
#调用matplotlib显示处理结果
titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV']
images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb, img_HLS, img_XYZ, img_LAB, img_YUV]
for i in range(9):
plt.subplot(3,3,i+1),plt.imshow(images[i[,'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
(3)基于像素操作的图像灰度化处理
1.最大值灰度处理方法
灰度值=彩色图像R、G、B三个分量中的最大值,该方法灰度化处理后的灰度图亮度很高。
gray(i,j)=max(R(i,j),G(i,j),B(i,j))
2.平均灰度处理方法
3.加权平均灰度处理方法
gray(i, j) =0.30xR(i, j)+0.59xG(i, j)+0.11xB(i, j)
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img=cv2.imread('luo.png')
#读取图像高度和宽度
height=img.shape[0]
width=img.shape[1]
#创建一副图像
grayimg1=np.zeros((height,width,3),np.uint8)
grayimg2=np.zeros((height,width,3),np.uint8)
grayimg3=np.zeros((height,width,3),np.uint8)
#图像灰度处理
for i in range(height):
for j in range(width):
#获取图像RGB最大值 gray=max(R,G,B)
gray1=max(img[[i,j],[0]],img[i,j][1],img[i,j][2])
#灰度值为RGB三个分量的平均值
gray2= (int(img[i,j][0]) + int(img[i,j][1]) + int(img[i,j][2])) / 3
#灰度加权平均法
gray3= 0.30 * img[i,j][0] + 0.59 * img[i,j][1] + 0.11 * img[i,j][2]
#获取图像素赋值
grayimg1[i,j]=np.uint8(gray1)
grayimg2[i,j]=np.uint8(gray2)
grayimg3[i,j]=np.uint8(gray3)
#显示图像
cv2.imshow('src',img)
cv2.imshow('gray1',grayimg1)
cv2.imshow('gray2',grayimg2)
cv2.imshow('gray3',grayimg3)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()
2.图像灰度线性变换
(1)灰度线性变换
图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。
当 α=1,b=0 时,保持原始图像
当 α=1,b!=0 时,图像所有的灰度值上移或下移
当 α=-1,b=255 时,原始图像的灰度值反转
当 α>1 时,输出图像的对比度增强
当 0<α<1 时,输出图像的对比度减小
当 α<0 时,原始图像暗区域变亮,亮区域变暗,图像求补
(2)图像灰度上移变换
通过灰度上移提升图像的亮度,由于图像的灰度值位于0至255区间之内,所以需要对灰度值进行溢出判断
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img=cv2.imread('luo.png')
#图像灰度转换
grayimage=cv2.cvtcolor(img,cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height=grayimage.shape[0]
width=grayimage.shape[1]
#创建一副图像
result=np.zeros((height,width,3).np.uint8)
#图像灰度上移变换 DB=DA+50
for i in range(height):
for j in range(width):
if(int(grayinage[i,j]+50)>255):
gray=255
else:
gray=int(grayimage[i,j]+50)
result[i,j]=np.uint8(gray)
#显示图像
cv2.imshow('Grayimage',grayimage)
cv2.imshow('Result',result)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()
(3)图像对比度增强变换 DB=DAX1.5
图像对比度减弱变换 DB=DA×0.8
图像灰度反色变换 DB=255-DA
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img=cv2.imread('luo.png')
#图像灰度转换
grayimage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height=grayimage.shape[0]
width=grayimage.shape[1]
#创建一副图像
result1=np.zeros((height,width,3),np.uint8)
result2=np.zeros((height,width,3),np.uint8)
result3=np.zeros((height,width,3),np.uint8)
#图像对比度增强变换 DB=DAX1.5
#图像对比度减弱变换 DB=DA×0.8
#图像灰度反色变换 DB=255-DA
for i in range(height):
for j in range(width):
gray2 = int(grayimage[i,j]*0.8)
gray3 = 255 - grayimage[i,j]
if(int(grayimage[i,j]*1.5)>255):
gray1=255
else:
gray1=int(grayimage[i,j]*1.5)
result1[i,j]=np.uint8(gray1)
result2[i,j]=np.uint8(gray2)
#显示图像
cv2.imshow('Grayimage1',grayimage1)
cv2.imshow('Grayimage2',grayimage2)
cv2.imshow('Grayimage3',grayimage3)
#等待显示
cv2.waitKey(0)
cv2.destoryAllWindows()