图像锐化python,python图像增强算法

  图像锐化python,python图像增强算法

  图像锐化与平滑相反,其目的是使模糊的图像变得清晰。既然是相反的目的,操作也应该是相反的。平滑使用图像邻域的加权求和或积分运算,而锐化使用导数(梯度)或有限差分。

  图像增强——基于一阶导数的梯度算子对于二维连续函数,点(x,y)处的梯度为

  两个偏导数的计算公式是

  梯度的幅度用作变化率的度量,其值如下。为什么需要梯度的振幅?想想平滑的想法。最简单的平均平滑就是在简单的一维情况下,将某个位置的值替换为基于该位置邻域的积分值。积分的逆变换就是微分,就是用这个位置的有效斜率代替这个位置的值。所以在二维情况下,梯度幅值取为新值。

  对应我们的二维离散图像,我们用差分代替导数。

  公式中涉及平方和与平方根的运算可以近似为绝对值的形式。

  在实践中,经常使用另一种近似梯度,即——罗伯特十字梯度。可以以模板的形式显示第一项和第二项,如下所示。

  使用模板参与计算的方法和之前一样,但是按照我们的习惯,我们更喜欢使用奇数大小的模板。因此,用于计算Sobel梯度的Sobel模板更常用。我看的书里没有索贝尔梯度的推导,百度好像也没看到有人怎么详细写的。所以我自己推了。基本思路和罗伯特十字梯度的推导是一样的,用绝对值之和代替平方和,减少计算量。不同的是,2x2模板扩展为3x3,这很直观:

  此时,我们可以将w1写成

  进一步调整,考虑到一个点的数值接近其两侧点的数值的平均值(可以是上下也可以是左右),可以适当变形代入上式。

  组织成一个模板,也就是说

  同样的,我们可以推断

  接下来,我们试着把我们的Sobel模板推到一个相对简单的图片上,看看效果。为了方便计算,我们可以直接使用前面写的一些函数,然后修改滤镜模板来达到效果。注意边界填充的方式。我们之前说过,平滑的目的是消除噪点而不是突出边缘,所以各种填充方式都可以尝试,影响不大;但是现在是为了突出图像中有意义的边缘,所以当我们在边界填充全零的时候,很有可能填充的部分和图像的边界会形成一个尖锐的边缘,然后当我们调整灰度范围的时候,较大的梯度幅度会把真实图像中有意义边缘的数值范围压缩到很小的范围,导致图像不清晰。所以最好使用重复填充或者镜像填充。

  请注意,因为我们的模板包含负数,并且图像中像素的数值类型是uint8,所以在相乘时很可能会发生截断。因此,首先,确保在与模板相乘时将图像中像素的数值类型转换为整数类型,或者在读取图像时进行以下设置:

  从pil导入图像导入numpy as npim=image.open(.)arr=np.array (im,dtype= int16 )则计算出的值可能大于或小于0。我们关注的是绝对值,所以可以取绝对值。最后,您需要将值的范围调整为0-255。实现代码如下:

  从PIL导入image import numpy as NP def Sobel filter(src,dst,filter_kind=1,padding= replicate ):imarray=NP . array(image . open(src),dtype= double )# print(imarray . dtype)height,width=imarray . shape new _ arr=NP . zeros((height,width),dtype= uint 16 )filter 1=NP . array([-1,0,1],[-2,0,2],[].8,a=-1,0,1,b=-1,0,1k=5,n=0,1,2,3.24,a=-2,-1,0,1,2a,b=int(n//k - (k-1)/2),int(n%k - 1)#filter_valueaa,bb=int(n//k),int(n%k)f_value=filter[aa,bb]if I a=0:if j b=0:total=imarray[0,0]* f _ value elif j b=width-1:total=imarray[0,-1]* f _ value else:total=IMA 0]* f _ value elif j b=width-1:total=imarray[I a,-1]* f _ value else:total=imarray[I a,j b]*f_valuenew_arr[i,j]=ABS(total)max=NP . max(new _ arr)min=NP . min(new _ arr)final _ arr=NP . zeros((height,width),dtype= uint 8 )for I in range(height):for j in range(width):final _ arr[I,j )src= C:/Users/60214/Desktop/python _ work/Digital Execution/geometry . jpg dst1= C:/Users/60214/Desktop/python _ work/Digital Execution/Sobel 1 . jpg dst2= C:/Users/60214/Desktop/python _ work/Digital Execution/Sobel 2 . jpg Sobel filter(src,dst 1,1) SobelFilter (src,dst 2,2)得到以下结果。可以看出,这两种不同的滤波模板,前者突出图像的垂直边缘,后者突出水平边缘,各有特长。

  图像增强——拉普拉斯算子的二维函数f(x,y)的二阶导数定义为

  同样,我们也应该尝试用差异来代替分化。

  也就是

  将这两个公式相加得到图像锐化的拉普拉斯算子。

  对应的过滤器模板是

  记住在一维微分的锐化中,我们都是取响应的绝对值,也就是滤波器模板和图像像素的计算值。绝对值相同的正值和负值表示相同的响应,因此也相当于使用下面的模板。

  然后分析模板的结构。所谓模板结构,比如W1,如果旋转90度,其实就是同一个模板;Sobel算子旋转90度,会变成一组中的另一个算子,对应一横一竖的特点。那么拉普拉斯算子,由于旋转90度等于自身,也说明它可以加强靠近水平和垂直方向的边缘。此外,我们如下构造对于45度旋转各向同性的滤波器:

  计算代码同上,但模板已被修改。但是从结果来看,我看出来效果并不好,甚至很模糊。这是因为我第一次实习用的图片都是素描作品,图像比较粗糙,不适合这种操作。

  filter1=np.array([[0,1,0],[1,-4,1],[0,1,0]])filter2=np.array([[1,1,1],[1,-8,1],[1,1,1]])filter3=np.array([[1,4,1],[4,-20,4],[1,4,1]])

  回到之前的动漫人物,处理结果如下。如你所见,粗略地勾画出人的边缘更准确有效。其中,第二张图和第三张图比第一张图的效果更好,因为它们在倾斜45度方向捕捉四个方向边缘的能力强于主要突出水平和垂直方向的第一张滤波模板。

  总结一下,一阶导数和二阶导数都可以锐化图像,突出边缘。区别有三:一、一阶导数通常会产生更宽的边缘;其次,二阶导数对台阶边缘的中心产生零交叉,而二阶导数对屋顶边缘取极值。第三,二阶导数对细节有很强的反应,比如细线,孤立的噪点。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: