'''如何利用opencv对图片进行局域化马赛克处理'''
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
hgs=cv2.imread('lbxx.jpg',1)
#设置单机鼠标开启
en=False
#鼠标事件
def draw(event,x,y,flags,param):
#全局变量
global en
#单机鼠标开启en值
if event==cv2.EVENT_LBUTTONDOWN:
en=True
#单机鼠标并且移动
elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_LBUTTONDOWN:
#调用函数打马赛克
if en:
drawHHH(y,x)
#单击鼠标弹起结束操作
elif event==cv2.EVENT_LBUTTONUP:
en=False
#定义图像局部采样操作,可以通过修改size的数值使自己局部马赛克的范围变大
def drawHHH(x,y,size=50):
#size*size采样处理
m=x/size*size
#为了防止有浮点数,将这个变成整数类型的
m=int(m)
n=y/size*size
print(m,n)
n=int(n)
#10*10区域设置为同一像素值
for i in range(size):
for j in range(size):
hgs[m+i][n+j]=hgs[m][n]
#打开对话框
cv2.namedWindow('image')
#调用draw函数设置鼠标操作
cv2.setMouseCallback('image',draw)
#循环处理
while(1):
cv2.imshow('image',hgs)
#按esc键退出,ASCII码为27
if cv2.waitKey(10)&0xFF==27:
break
#按a键保存
elif cv2.waitKey(10)&0xFF==65:
cv2.imwrite('save1232131123.jpg',hgs)
#退出窗口
cv2.destroyAllWindows()
照片原图:
经过马赛克之后的图像显示: