python 检测图片是否有马赛克


Posted in Python onDecember 01, 2020

首先是Canny边缘检测,将图片的边缘检测出来,参考博客https://www.cnblogs.com/techyan1990/p/7291771.html

原理讲的很清晰,给原博主一个赞

边缘检测之后按照正方形检索来判定是否是马赛克内容

原理知晓了之后就很好做了

话说MATLAB转化为python的过程还是很有趣的

from PIL import Image
import numpy as np
import math
import warnings

#算法来源,博客https://www.cnblogs.com/techyan1990/p/7291771.html和https://blog.csdn.net/zhancf/article/details/49736823
highhold=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)]#梯度x
gy=[[0 for i in range(width)]for j in range(height)]#梯度y
theta=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,0
rm=np.array([[0 for i in range(width)]for j in range(height)])#输出矩阵
#高斯滤波平滑,3x3
for 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.0924
for 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]=1
for 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]=0
for 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=35
lowvalue=16
imgnumber=[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]+=1
for i in range(lowvalue,value):
 print("length:{} number:{}".format(i,imgnumber[i]))

结果图可以上一下了

可以看出在一定程度上能够检测出马赛克内容

原图

python 检测图片是否有马赛克

边缘图案

python 检测图片是否有马赛克

正方形数量

python 检测图片是否有马赛克

以上就是python 检测图片是否有马赛克的详细内容,更多关于python 检测图片马赛克的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python list操作用法总结
Nov 10 Python
python实现rsa加密实例详解
Jul 19 Python
简单实现python收发邮件功能
Jan 05 Python
python list转矩阵的实例讲解
Aug 04 Python
python使用folium库绘制地图点击框
Sep 21 Python
对python for 文件指定行读写操作详解
Dec 29 Python
python实现最小二乘法线性拟合
Jul 19 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
Python 合并拼接字符串的方法
Jul 28 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
python语言实现贪吃蛇游戏
Nov 13 Python
python中pop()函数的语法与实例
Dec 01 #Python
python爬虫多次请求超时的几种重试方法(6种)
Dec 01 #Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 #Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
Dec 01 #Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 #Python
使用python爬取抖音app视频的实例代码
Dec 01 #Python
基于Python实现粒子滤波效果
Dec 01 #Python
You might like
php 操作调试的方法
2012/07/12 PHP
php+mysqli批量查询多张表数据的方法
2015/01/29 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
PHP goto语句用法实例
2019/08/06 PHP
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
express 项目分层实践详解
2018/12/10 Javascript
VUE中使用MUI方法
2019/02/12 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
[02:52]2014DOTA2西雅图国际邀请赛 CIS战队巡礼
2014/07/07 DOTA
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
python+opencv像素的加减和加权操作的实现
2019/07/14 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
python实现图片素描效果
2020/09/26 Python
基于PyTorch中view的用法说明
2021/03/03 Python
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
致跳远、跳高运动员广播稿
2014/01/09 职场文书
语文课外活动总结
2014/08/27 职场文书
销售员态度差检讨书
2014/10/26 职场文书
综合测评个人总结
2015/03/03 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
读完《骆驼祥子》的观后感!
2019/07/05 职场文书
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python