图像处理:
通过将图片转化成数组(三维立体)进行操作,在将数组形式转化回RGB图像格式
self.img=np.array(self.photo)
Image.fromarray(self.img.astype(‘uint8’)).convert(‘RGB’)
通过将图片转化成数组(二维平面)进行操作,在将数组形式转化回灰度图像格式
self.img=np.array(self.photo.convert(‘L’))
self.img= Image.fromarray(self.img.astype(‘uint8’)).convert(‘L’)
一.图像增强
1.灰度化
(1)线性灰度增强
R=G=B=R*0.30+G*0.59+B*0.11
for i in range(self.img.shape[0]):
for j in range(self.img.shape[1]):
c=0.3*self.img[i][j][0]+self.img[i][j][1]*0.59+self.img[i][j][2]*0.11#三维
self.img[i][j][0]=int(c)
self.img[i][j][1]=int(c)
self.img[i][j][2]=int(c)
2.直方图
(1)直方图统计
x=np.arange(0,256)
#通过numpy里的ravel函数,及切片功能。将三维的数组格式图片的RGB分量分别提取成一维。
plt.hist(img[:,:,0].ravel(),x,density=True)#density=True则返回概率密度
plt.show()
plt.hist(img[:,:,1].ravel(),x,density=True)
plt.show()
plt.hist(img[:,:,2].ravel(),x,density=True)
plt.show()
(2)直方图均衡化(对比度)
3.噪声
(1)椒盐噪声
for i in range(img.shape[0]):
for j in range(img.shape[1]):
c=0.3*img[i][j][0]+img[i][j][1]*0.59+img[i][j][2]*0.11
img[i][j][0]=int(c)
img[i][j][1]=int(c)
img[i][j][2]=int(c)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
if float(np.random.random(1))<0.005:
if float(np.random.random(1))<0.5:
img[i][j][0]=0
img[i][j][1]=0
img[i][j][2]=0
else:
img[i][j][0]=255
img[i][j][1]=255
img[i][j][2]=255
4.平滑
(1)中值滤波法
for i in range(1,img.shape[0]-1):
for j in range(1,img.shape[1]-1):
img[i][j][0]=np.median(img[i-1:i+2,j-1:j+2])
img[i][j][1]=np.median(img[i-1:i+2,j-1:j+2])
img[i][j][2]=np.median(img[i-1:i+2,j-1:j+2])
(2)加权平均法(高斯滤波)
#加权平均模板
m=1/16*np.array([[1,2,1],[2,4,2],[1,2,1]])
m=1/10*np.array([[1,1,1],[1,2,1],[1,1,1]])
(3)邻域平均法
#3*3模板
m=1/9*np.array([[1,1,1],[1,1,1],[1,1,1]])
5.锐化(边缘检测)
基于搜索:sobel,scharr
现在常用:canny
零穿越: (1)拉普拉斯算子法
l=np.array([[0,-1,0],[-1,4,-1],[0,-1,0]])
#l=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
# 在python中用原拉普拉斯算子可能得到效果不好 则从第0行开始遍历
for i in range(self.img.shape[0]-2):#二维
for j in range(self.img.shape[1]-2):
s=np.sum(l*np.array(self.img[i:i+3,j:j+3]))
if s>255:
s=255
if s<0:
s=0
self.img[i][j]=s
(2)罗伯特算子法(梯度法)
t=int(input('输入门限值T:'))
for i in range(self.img.shape[0]-1):#二维
for j in range(self.img.shape[1]-1):
g=abs(int(self.img[i][j])-int(self.img[i+1][j+1]))+abs(int(self.img[i+1][j])-int(self.img[i][j+1]))
# overflow encountered in ubyte_scalars 报错则在每个像素前加int
if g>=t:
if g+100>255:
self.img[i][j]=255
else:
self.img[i][j]=g+50
#self.img[i][j]=g
# img[self.img.shape[0]-1][:]或img[:][self.img.shape[0]-1]输出的均为最后一行
# 写在一个括号里才为行或列的索引
self.img[self.img.shape[