python 그림 에 모자이크 가 있 는 지 검사 합 니 다.
원 리 를 분명하게 말 해서 원 블 로 거 에 게 칭찬 을 하 다.
테두리 검출 후 정사각형 검색 에 따라 모자이크 내용 여 부 를 판정 합 니 다.
원 리 를 알 게 되면 잘 할 수 있어 요.
그런데 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 에서 이미지 모자이크 검 측 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.