python-使用鼠标对图片进行涂抹&自定义绘图

一:可以用鼠标左键按住拖动,路径所过区域就会被"模糊涂抹"。
这种方式非常适合快速搭建简单交互式图片编辑工具!

python 复制代码
import cv2
import numpy as np

# 读取图片
img = cv2.imread('input.jpg')
img_disp = img.copy()    # 显示用
smudge_radius = 15       # 涂抹半径(像素)
drawing = False          # 鼠标是否按下
prev_pt = None           # 记录上一个点

def smudge(img, pt, radius):
    x, y = pt
    h, w = img.shape[:2]
    # 限制边界
    x0, x1 = max(0, x-radius), min(w, x+radius)
    y0, y1 = max(0, y-radius), min(h, y+radius)
    roi = img[y0:y1, x0:x1]
    if roi.shape[0]>1 and roi.shape[1]>1:
        blur = cv2.blur(roi, (radius*2//3, radius*2//3))
        img[y0:y1, x0:x1] = blur

def mouse_callback(event, x, y, flags, param):
    global drawing, prev_pt, img_disp

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        prev_pt = (x, y)
        smudge(img_disp, (x, y), smudge_radius)
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing and prev_pt is not None:
            # 连续沿路径涂抹
            cv2.line(img_disp, prev_pt, (x, y), (255,0,0), 1) # 可视路径(可删)
            smudge(img_disp, (x, y), smudge_radius)
            prev_pt = (x, y)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        prev_pt = None

# 创建窗口和回调
cv2.namedWindow('Smudge Paint')
cv2.setMouseCallback('Smudge Paint', mouse_callback)

while True:
    cv2.imshow('Smudge Paint', img_disp)
    key = cv2.waitKey(1)
    if key == 27:   # ESC退出
        break
    if key == ord('r'):  # 按r重置
        img_disp = img.copy()

cv2.destroyAllWindows()
cv2.imwrite('smudge_result.jpg', img_disp)

说明:

1、按住鼠标左键拖动即可"涂抹"。

2、按r键可以重置为原始图片。

3、涂抹原理:取鼠标周围一定半径区域,做均值模糊,并写回图片。

你可以把smudge函数换为其他混合算法,实现油画等效果。

二: 可以结合 Python、OpenCV 和鼠标事件,实现"自定义绘图方式,生成任意形状遮罩,修复大块杂物/划痕/文字等"。
原理:通过鼠标自由绘制遮罩区域,然后用 OpenCV 的 inpaint 修复工具进行内容感知填充。

python 复制代码
import cv2
import numpy as np

img = cv2.imread('input.jpg')
img_disp = img.copy()
mask = np.zeros(img.shape[:2], dtype=np.uint8)

drawing = False
ix, iy = -1, -1

def draw_mask(event, x, y, flags, param):
    global drawing, ix, iy, mask, img_disp
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing:
            # 画粗一些的自由笔迹
            cv2.circle(mask, (x, y), 12, 255, -1)
            cv2.circle(img_disp, (x, y), 12, (0,0,255), -1)  # 可视化红色笔迹
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False

cv2.namedWindow('Draw Mask')
cv2.setMouseCallback('Draw Mask', draw_mask)

while True:
    cv2.imshow('Draw Mask', img_disp)
    key = cv2.waitKey(1)
    if key == 27:
        break
    if key == ord('r'):  # 重置
        img_disp = img.copy()
        mask[:] = 0
    if key == ord('f'):  # 修复
        # 用inpaint修复
        result = cv2.inpaint(img, mask, inpaintRadius=8, flags=cv2.INPAINT_TELEA)
        cv2.imshow('Inpaint result', result)
        cv2.imwrite('inpaint_result.jpg', result)

cv2.destroyAllWindows()

使用说明

1、拖动鼠标左键,自由在图片上标记修复区域(红色标记,遮罩实际为 mask 数组)。

2、按 f 键,调用 OpenCV inpaint ,被覆盖区域自动内容感知修复(去除涂画的字、斑点、划痕等)。

3、按 r 键重置图片和遮罩。

4、修复结果自动保存为 'inpaint_result.jpg'。

相关推荐
麦麦大数据1 小时前
MacOS 安装Python 3.13【同时保留旧版本】
开发语言·python·macos·python安装
梦想画家5 小时前
基于PyTorch的时间序列异常检测管道构建指南
人工智能·pytorch·python
PythonFun7 小时前
OCR图片识别翻译工具功能及源码
python·ocr·机器翻译
虫师c7 小时前
Python浪漫弹窗程序:Tkinter实现动态祝福窗口教程
python·tkinter·动画效果·gui编程·弹窗效果
灯火不休时8 小时前
95%准确率!CNN交通标志识别系统开源
人工智能·python·深度学习·神经网络·cnn·tensorflow
deephub9 小时前
FastMCP 入门:用 Python 快速搭建 MCP 服务器接入 LLM
服务器·人工智能·python·大语言模型·mcp
南宫乘风9 小时前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
番石榴AI9 小时前
基于机器学习优化的主图选择方法(酒店,景点,餐厅等APP上的主图展示推荐)
图像处理·人工智能·python·机器学习
qq7422349849 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
2401_8414956410 小时前
【自然语言处理】轻量版生成式语言模型GPT
人工智能·python·gpt·深度学习·语言模型·自然语言处理·transformer