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简单判断序列是否为空的方法
Jun 30 Python
使用XML库的方式,实现RPC通信的方法(推荐)
Jun 14 Python
PyTorch基本数据类型(一)
May 22 Python
解决django后台样式丢失,css资源加载失败的问题
Jun 11 Python
Python学习笔记之While循环用法分析
Aug 14 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
python tkinter之 复选、文本、下拉的实现
Mar 04 Python
Python 炫技操作之合并字典的七种方法
Apr 10 Python
Python爬取数据并实现可视化代码解析
Aug 12 Python
python 贪心算法的实现
Sep 18 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 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
检测png图片是否完整的php代码
2010/09/06 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
json简单介绍
2008/06/10 Javascript
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
javascript使用eval或者new Function进行语法检查
2010/10/16 Javascript
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
微信小程序url传参写变量的方法
2018/08/09 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
纯JS开发baguetteBox.js响应式画廊插件
2020/06/28 Javascript
jQuery编写QQ简易聊天框
2020/08/27 jQuery
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
Python字符编码判断方法分析
2016/07/01 Python
python调用Delphi写的Dll代码示例
2017/12/05 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
PyTorch之图像和Tensor填充的实例
2019/08/18 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
外包公司软件测试工程师
2014/11/01 面试题
住宅使用说明书
2014/05/09 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
单位实习鉴定评语
2015/01/04 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang