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 相关文章推荐
Django自定义分页效果
Jun 27 Python
Python实现一个简单的验证码程序
Nov 03 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
Python2和Python3的共存和切换使用
Apr 12 Python
python 判断文件还是文件夹的简单实例
Jun 10 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
20行Python代码实现视频字符化功能
Apr 13 Python
Python实现弹球小游戏
Aug 01 Python
Python连接mysql方法及常用参数
Sep 01 Python
如何用用Python将地址标记在地图上
Feb 07 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作为Shell脚本语言使用
2006/10/09 PHP
如何使用脚本模仿登陆过程
2006/11/22 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php使用ereg验证文件上传的方法
2014/12/16 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
PHP  Yii清理缓存的实现方法
2016/11/10 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
JavaScript中SQL语句的应用实现
2010/05/04 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
js单词形式的运算符
2014/05/06 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
avalon js实现仿微博拖动图片排序
2015/08/14 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
JavaScript链式调用原理与实现方法详解
2020/05/16 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python实现用户登录系统
2016/05/21 Python
Python操作mongodb的9个步骤
2018/06/04 Python
python-tornado的接口用swagger进行包装的实例
2019/08/29 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
商场促销活动策划方案
2014/08/18 职场文书
离职感谢信
2015/01/21 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python