图片加马赛克的原理:
将图片分成若干个区域,选取子区域内的一个像素点的值替代子区域内所有的像素点的值
python+opencv实现鼠标所选区域打马赛克
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取原始图像
im = cv2.imread(r'C:\Users\ZUK\PycharmProjects\pictures\picture13.png', cv2.IMREAD_UNCHANGED)
# 鼠标事件
def draw(event, x, y, flags, param):
# 鼠标左键按下并且移动
if event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_LBUTTONDOWN:
# 调用函数打马赛克
drawMask(y, x)
# 图像局部采样操作
def drawMask(x, y, size=20):
#将马赛克区域划分成size*size
m = x // size*size
n = y // size*size
print(m, n)
# 10*10区域设置为同一像素值
for i in range(size):
for j in range(size):
im[m + i][n + j] = im[m][n]
# 新建立窗口
cv2.namedWindow('image')
# 调用鼠标回调函数
cv2.setMouseCallback('image', draw)
# 循环处理
while 1:
cv2.imshow('image', im)
# 按ESC键退出
if cv2.waitKey(10) & 0xFF == 27:
break
# 按s键保存图片
elif cv2.waitKey(10) & 0xFF == 115:
cv2.imwrite('sava.png', im)
# 退出窗口
cv2.destroyAllWindows()
#将马赛克区域划分成size*size
m = x
n = y
结果如下出现了马赛克重叠现象
因为m,n的选取是连续的,即每个区域的起点是重叠的,一旦鼠标移动m,n的值就更新,比如开始x = 100,y = 100
,马赛克区域就是[[100,100],[110,110]]
,移动鼠标之后x = 105,y=105
,新的马赛克区域就是[[105,105],[115,115]]
,这样两个马赛克就出现重叠。
#将马赛克区域划分成size*size
m = x // size*size
n = y // size*size
通过上面的代码避免了这种情况,因为当x = 105,y=105
时,通过//
运算去除了余数,返回的m = 100, n =100
,马赛克区域还是[[100,100],[110,110]]
,只有当鼠标的移动范围大于size时,才会更新m,n
比如x = 112,y = 112
,此时的马赛克区域就是[[110,110],[120,120]]