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 08 Python
python实现折半查找和归并排序算法
Apr 14 Python
详解Python pygame安装过程笔记
Jun 05 Python
python字典操作实例详解
Nov 16 Python
python切片及sys.argv[]用法详解
May 25 Python
Python地图绘制实操详解
Mar 04 Python
python实现祝福弹窗效果
Apr 07 Python
在Python中使用MySQL--PyMySQL的基本使用方法
Nov 19 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
Mar 09 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
python 基于opencv实现图像增强
Dec 23 Python
对Keras自带Loss Function的深入研究
May 25 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
PHP 身份证号验证函数
2009/05/07 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
phpQuery让php处理html代码像jQuery一样方便
2015/01/06 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
JQuery学习笔录 简单的JQuery
2012/04/09 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
Javascript继承机制详解
2017/05/30 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
Python栈算法的实现与简单应用示例
2017/11/01 Python
解决Python运行文件出现out of memory框的问题
2018/12/03 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
python 调用Google翻译接口的方法
2020/12/09 Python
创建精神文明单位实施方案
2014/03/08 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
中秋节主题班会
2015/08/14 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
一篇文章带你复习java知识点
2021/06/28 Java/Android