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()
posted @ 2021-04-16 09:50  boyang987  阅读(204)  评论(0编辑  收藏  举报