教你用鼠标画圈圈打马赛克
【摘要】 因为我每次想打码或者框住图片某些部分的内容时,总会不知所措,找不到一款方便作标记的看图软件,然而放到GNU(GNU是linux平台的一款类PS软件)里处理的话又太浪费时间。所以写了下面的代码,用opencv实现这两种效果。
前言:
刚刚登陆了下账号,发现云专家认证通过了,有点小窃喜。我点开自己头像看到,就一篇关于modelarts的文章。jio得跟其他用户比起来挺少的,所以搬运下我自己博客的文章,先凑凑数。hhh
发布文章后超链接不跳转?
正文:
编写脚本的缘由:
因为我每次想打码或者框住图片某些部分的内容时,总会不知所措,找不到一款方便作标记的看图软件,然而放到GNU(GNU是linux平台的一款类PS软件)里处理的话又太浪费时间。所以写了下面的代码,用opencv实现这两种效果。
使用方法:
默认画马赛克,按1-2秒k键画圈圈,按1-2秒m键画马赛克。
PS:这里默认读者在自己电脑上已经安装好opencv了,下边是代码,有需要的读者复制粘贴即可。
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed May 13 20:10:13 2020
@author: hairuo
"""
import cv2 as cv
#读取原始图像
img = cv.imread('./结业证书.jpg')
#设置鼠标左键开启
drawing = False
#按下k表示画框框,按m表示画马赛克
mode = False
#鼠标事件
def draw(event, x, y, flags, param):
global drawing,mode
#鼠标左键按下开启en值
if event==cv.EVENT_LBUTTONDOWN:
drawing = True
#鼠标左键按下并且移动
elif event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_LBUTTONDOWN:
#调用函数打马赛克
if drawing:
if mode is False:
draw_mosaic(y,x)
else:
cv.circle(img, (x, y), 3, (0,0,255), 3)
#鼠标左键弹起结束操作
elif event==cv.EVENT_LBUTTONUP:
drawing = False
#图像局部采样操作
def draw_mosaic(x, y, size=20):
#size*size采样处理
m = x / size * size
n = y / size * size
print(m, n)
m = int(m)
n = int(n)
#10*10区域设置为同一像素值
for i in range(size):
for j in range(size):
img[m+i][n+j] = img[m][n]
#打开对话框
cv.namedWindow('image')
#调用draw函数设置鼠标操作
cv.setMouseCallback('image', draw)
#循环处理
while(1):
cv.imshow('image', img)
#按ESC键退出
if cv.waitKey(10)&0xFF==107:
mode = True
#按m键画马赛克
elif cv.waitKey(10)&0xFF==109:
mode = False
#按s键保存图片
elif cv.waitKey(10)&0xFF==115:
cv.imwrite('sava.png', img)
elif cv.waitKey(10)&0xFF==27:
break
#退出窗口
cv.destroyAllWindows()
演示效果:
废话不多说,直接上图,立见成效:
注意:
本文内容来自我的个人博客网站,未经笔者允许,读者不得转载本文以作他用,本博客遵循CC BY-NC-SA 4.0协议。
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
张辉2020/07/31 06:41:521楼编辑删除举报