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之做一个小游戏
Sep 28 Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
python使用str &amp; repr转换字符串
Oct 13 Python
python多线程socket编程之多客户端接入
Sep 12 Python
对python多线程中Lock()与RLock()锁详解
Jan 11 Python
基于Python打造账号共享浏览器功能
May 30 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
python实现局域网内实时通信代码
Dec 22 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
记一次Django响应超慢的解决过程
Sep 17 Python
UI自动化定位常用实现方法代码示例
Oct 27 Python
python通过opencv调用摄像头操作实例分析
Jun 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
一个程序下载的管理程序(四)
2006/10/09 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
php实现搜索类封装示例
2016/03/31 PHP
PHP实现验证码校验功能
2017/11/16 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
React diff算法的实现示例
2018/04/20 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
微信小程序音乐播放器开发
2019/11/20 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
python中sets模块的用法实例
2014/09/30 Python
python黑魔法之参数传递
2016/02/12 Python
python版简单工厂模式
2017/10/16 Python
TensorFlow变量管理详解
2018/03/10 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
市政管理求职信范文
2014/05/07 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
浅谈python数据类型及其操作
2021/05/25 Python
拙作再改《我的收音机情缘》
2022/04/05 无线电