OpenCV的窗口过程与图像马赛克
参考
https://www.cnblogs.com/wj-1314/p/12191084.html
OpenCV的窗口过程与图像马赛克
- 文中提到用一定的block_size去实现马赛克效果,
为避免重叠,会使用一个已经处理好的马赛克图 - 关于边缘部分 ,考虑用取余法得到边缘的范围, 再从邻近位置copy
- opencv cv2.namedWindow('image') 可以像MFC那样处理窗口过程
- while(1): cv2.imshow('image', img),可保证图片能及时刷新
- 效果
- 完整代码
# _*_coding:utf-8_*_
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 鼠标事件
def draw(event, x, y, flags, parma):
global en
# 鼠标左键按下开启 en 键
if event == cv2.EVENT_LBUTTONDOWN:
print("mouse at",x,y)
en = True
# 鼠标左键按下并且移动
elif event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_LBUTTONDOWN:
# 调用函数打马赛克
if en:
drawMask(y, x)
# 鼠标左键弹起结束操作
elif event == cv2.EVENT_LBUTTONUP:
en = False
# 图像局部采用操作
def drawMask(x, y, size=10):
global img_mosaic
# size*size 采样处理
m = int(x / size * size)
n = int(y / size * size)
# 10*10 区域设置为同一像素值
img[m:m+size,n:n+size] = img_mosaic[m:m+size,n:n+size]
#for i in range(int(size)):
# for j in range(int(size)):
# img[m+i][n+j] = img[m][n]
if __name__ == '__main__':
# 读取原始图像
img = cv2.imread('durant.jpg')
height,width,_ = img.shape
#马赛克大小采用操作(10,10)
block_size=10
img_mosaic= img.copy()
for y in range(0,height,block_size):
for x in range(0,width,block_size):
img_mosaic[y:y+block_size,x:x+block_size] = img[y,x]
#关于边缘部分 ,考虑用 取余法得到边缘的范围 再从邻近位置copy
img_mosaic[height- (height % block_size) :height, width- (width % block_size) :width ] = img_mosaic[height- 2*(height % block_size) :height- (height % block_size), width- 2*(width % block_size) :width- (width % block_size) ]
# 设置鼠标右键开启
en = False
# 打开对话框
cv2.namedWindow('image')
# 调用draw 函数设置鼠标操作
cv2.setMouseCallback('image', draw)
cv2.imshow('img_mosaic', img_mosaic)
# 循环处理
while(1):
#imshow必须被多次调用,以使得图片能够及时刷新
cv2.imshow('image', img)
# 按 ESC键退出
if cv2.waitKey(10) & 0xFF == 27:
break
# 按 s 键保存图片
elif cv2.waitKey(10) & 0xFF == 115:
cv2.imwrite('save.jpg', img)
# 退出窗口
cv2.destroyAllWindows()