时间:2021-05-22
首先是Canny边缘检测,将图片的边缘检测出来,参考博客https:///techyan1990/p/7291771.html和https://blog.csdn.net/zhancf/article/details/49736823highhold=200#高阈值lowhold=40#低阈值warnings.filterwarnings("ignore")demo=Image.open("noise_check//23.jpg")im=np.array(demo.convert('L'))#灰度化矩阵print(im.shape)print(im.dtype)height=im.shape[0]#尺寸width=im.shape[1]gm=[[0 for i in range(width)]for j in range(height)]#梯度强度gx=[[0 for i in range(width)]for j in range(height)]#梯度xgy=[[0 for i in range(width)]for j in range(height)]#梯度ytheta=0#梯度方向角度360度dirr=[[0 for i in range(width)]for j in range(height)]#0,1,2,3方位判定值highorlow=[[0 for i in range(width)]for j in range(height)]#强边缘、弱边缘、忽略判定值2,1,0rm=np.array([[0 for i in range(width)]for j in range(height)])#输出矩阵#高斯滤波平滑,3x3for i in range(1,height-1,1): for j in range(1,width-1,1): rm[i][j]=im[i-1][j-1]*0.0924+im[i-1][j]*0.1192+im[i-1][j+1]*0.0924+im[i][j-1]*0.1192+im[i][j]*0.1538+im[i][j+1]*0.1192+im[i+1][j-1]*0.0924+im[i+1][j]*0.1192+im[i+1][j+1]*0.0924for i in range(1,height-1,1):#梯度强度和方向 for j in range(1,width-1,1): gx[i][j]=-rm[i-1][j-1]+rm[i-1][j+1]-2*rm[i][j-1]+2*rm[i][j+1]-rm[i+1][j-1]+rm[i+1][j+1] gy[i][j]=rm[i-1][j-1]+2*rm[i-1][j]+rm[i-1][j+1]-rm[i+1][j-1]-2*rm[i+1][j]-rm[i+1][j+1] gm[i][j]=pow(gx[i][j]*gx[i][j]+gy[i][j]*gy[i][j],0.5) theta=math.atan(gy[i][j]/gx[i][j])*180/3.1415926 if theta>=0 and theta<45: dirr[i][j]=2 elif theta>=45 and theta<90: dirr[i][j]=3 elif theta>=90 and theta<135: dirr[i][j]=0 else: dirr[i][j]=1for i in range(1,height-1,1):#非极大值抑制,双阈值监测 for j in range(1,width-1,1): NW=gm[i-1][j-1] N=gm[i-1][j] NE=gm[i-1][j+1] W=gm[i][j-1] E=gm[i][j+1] SW=gm[i+1][j-1] S=gm[i+1][j] SE=gm[i+1][j+1] if dirr[i][j]==0: d=abs(gy[i][j]/gx[i][j]) gp1=(1-d)*E+d*NE gp2=(1-d)*W+d*SW elif dirr[i][j]==1: d=abs(gx[i][j]/gy[i][j]) gp1=(1-d)*N+d*NE gp2=(1-d)*S+d*SW elif dirr[i][j]==2: d=abs(gx[i][j]/gy[i][j]) gp1=(1-d)*N+d*NW gp2=(1-d)*S+d*SE elif dirr[i][j]==3: d=abs(gy[i][j]/gx[i][j]) gp1=(1-d)*W+d*NW gp2=(1-d)*E+d*SE if gm[i][j]>=gp1 and gm[i][j]>=gp2: if gm[i][j]>=highhold: highorlow[i][j]=2 rm[i][j]=1 elif gm[i][j]>=lowhold: highorlow[i][j]=1 else: highorlow[i][j]=0 rm[i][j]=0 else: highorlow[i][j]=0 rm[i][j]=0for i in range(1,height-1,1):#抑制孤立低阈值点 for j in range(1,width-1,1): if highorlow[i][j]==1 and (highorlow[i-1][j-1]==2 or highorlow[i-1][j]==2 or highorlow[i-1][j+1]==2 or highorlow[i][j-1]==2 or highorlow[i][j+1]==2 or highorlow[i+1][j-1]==2 or highorlow[i+1][j]==2 or highorlow[i+1][j+1]==2): #highorlow[i][j]=2 rm[i][j]=1#img=Image.fromarray(rm)#矩阵化为图片#img.show()#正方形法判定是否有马赛克value=35lowvalue=16imgnumber=[0 for i in range(value)]for i in range(1,height-1,1):#性价比高的8点判定法 for j in range(1,width-1,1): for k in range(lowvalue,value): count=0 if i+k-1>=height or j+k-1>=width:continue if rm[i][j]!=0:count+=1#4个顶点 if rm[i+k-1][j]!=0:count+=1 if rm[i][j+k-1]!=0:count+=1 if rm[i+k-1][j+k-1]!=0:count+=1 e=(k-1)//2 if rm[i+e][j]!=0:count+=1 if rm[i][j+e]!=0:count+=1 if rm[i+e][j+k-1]!=0:count+=1 if rm[i+k-1][j+e]!=0:count+=1 if count>=6: imgnumber[k]+=1for i in range(lowvalue,value): print("length:{} number:{}".format(i,imgnumber[i]))
结果图可以上一下了
可以看出在一定程度上能够检测出马赛克内容
原图
边缘图案
正方形数量
以上就是python 检测图片是否有马赛克的详细内容,更多关于python 检测图片马赛克的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
打了马赛克的图片不能还原,马赛克效果的使用,可以有效防止图片中的敏感信息被无意泄露所造成的严重后果,由于马赛克的使用原理是对图片的像素进行改变,因此从根本上解决
打了马赛克的照片是没有办法复原的,因为打了马赛克的照片已经被破坏了原来的图片样式,除非找到原来没有打马赛克之前的照片。 图片是指由图形、图像等构成的平面媒体。
本文实例讲述了Python实现PS滤镜中马赛克效果。分享给大家供大家参考,具体如下:这里利用Python实现PS滤镜中的马赛克效果,具体的算法原理和效果可以参考
有时我们发照片中有些部分不想要别人看到,我们可以打马赛克,有些网站上传照片中也需要对敏感信息打马赛克,那么怎么给图片打马赛克呢?软件名称:PicPick截图软件
本文实例讲述了php实现图片添加描边字和马赛克的方法。分享给大家供大家参考。具体实现方法如下:马赛克:voidimagemask(resourceimage,i