python+opencv实现鼠标所选区域打马赛克

图片加马赛克的原理
将图片分成若干个区域,选取子区域内的一个像素点的值替代子区域内所有的像素点的值

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]]

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值