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解析树及树的遍历
Feb 03 Python
Python读写Json涉及到中文的处理方法
Sep 12 Python
Python heapq使用详解及实例代码
Jan 25 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
Jan 07 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
python 中文件输入输出及os模块对文件系统的操作方法
Aug 27 Python
用python爬取租房网站信息的代码
Dec 14 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
Python统计时间内的并发数代码实例
Dec 28 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
Python学习之time模块的基本使用
Jan 17 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调用数据库的存贮过程!
2006/10/09 PHP
php获取字符串前几位的实例(substr返回字符串的子串用法)
2017/03/08 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
浅析return false的正确使用
2013/11/04 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
微信小程序 WebSocket详解及应用
2017/01/21 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
详解vue-router的Import异步加载模块问题的解决方案
2020/05/13 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
python中的reduce内建函数使用方法指南
2014/08/31 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
python重试装饰器的简单实现方法
2019/01/31 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
港澳通行证委托书怎么写
2014/08/02 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
《青山不老》教学反思
2016/02/22 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
无线电通信名词解释
2022/02/18 无线电