【Python】数字图像处理原理

图像处理:

通过将图片转化成数组(三维立体)进行操作,在将数组形式转化回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[
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值