Python编程-使用OpenCV和Numpy库实现图片去水印(附代码)

目录

安装OpenCV和NumPy库

开始

读取图像

选取水印位置

删除指定位置的水印

去除并修复水印(完整代码)

优化修复方法

效果(标红区域是原水印位置)

注意


安装OpenCV和NumPy库

  1. cv2是基于OpenCV的图像处理库,可以对图像进行腐蚀,膨胀等操作;
  2. Numpy这是一个强大的处理矩阵和维度运算的库。
pip install opencv-python
pip install numpy

开始

读取图像

cv2的三个基本函数:使用cv2.imread()cv2.imshow()cv2.imwrite()分别可以读取、显示和保存图像。

import cv2
import numpy as np


def remove_watermark(image_path, output_path):
    # 读取图像, image_path='test.png'
    image = cv2.imread(image_path)

    cv2.imshow('test.png', image)
    cv2.waitKey(0)
    cv2.imwrite('test_2.png', image)

选取水印位置

为了能够图片上点击水印的位置,并获取该水印的定位和大小,我们需要一个图形用户界面(GUI)库来与用户进行交互。Python中常用的GUI库有tkinterPyQtwxPython等。下面将使用tkinter库来演示如何实现这个功能。

import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk

pos = []


def get_click_positions(canvas, image, root):
    """获取用户点击的四个角位置"""
    positions = []
    click_count = 0

    def on_click(event):
        print("点击")
        nonlocal click_count, positions
        x = event.x
        y = event.y
        positions.append((x, y))
        click_count += 1

        if click_count == 4:
            # 用户已点击四个角,关闭画布并返回位置
            canvas.unbind('<Button-1>')
            print(f"Watermark positions: {positions}")
            # 计算水印大小和位置
            # positions.sort(key=lambda p: p[0] + p[1])  # 根据点击顺序排序
            top_left, top_right, bottom_right, bottom_left = positions
            x1, y1 = top_left
            x2, y2 = bottom_right
            width = x2 - x1
            height = y2 - y1
            print(f"Watermark position: ({x1}, {y1}), Size: ({width}x{height})")
            # 关闭程序
            root.destroy()

    # canvas.bind('<Button-1>', on_click)
    canvas.config(cursor="cross")  # 设置鼠标样式为十字线

    # 显示图片
    photo = ImageTk.PhotoImage(image)
    image_label = tk.Label(canvas, image=photo)
    image_label.image = photo
    image_label.place(x=0, y=0, relwidth=1, relheight=1)
    image_label.bind('<Button-1>', on_click)
    # canvas.pack(fill=tk.BOTH, expand=tk.YES)
    canvas.pack()

    messagebox.showinfo("Instru
  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,让我来回答你的问题。下面是 Python 代码使用 OpenCVNumPy 库对带有椒盐噪声的图片施加三种空域滤波: ```python import cv2 import numpy as np # 加载带有椒盐噪声的图片 img = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE) # 定义三种滤波器:均值滤波器、中值滤波器和高斯滤波器 kernel_size = 3 mean_filter = np.ones((kernel_size, kernel_size), np.float32) / kernel_size ** 2 median_filter = cv2.medianBlur(img, kernel_size) gaussian_filter = cv2.GaussianBlur(img, (kernel_size, kernel_size), 0) # 显示滤波器效果 cv2.imshow('Original Image', img) cv2.imshow('Mean Filtered Image', cv2.filter2D(img, -1, mean_filter)) cv2.imshow('Median Filtered Image', median_filter) cv2.imshow('Gaussian Filtered Image', gaussian_filter) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个代码中,我们首先使用 `cv2.imread()` 函数加载一张带有椒盐噪声的灰度图片。然后,我们定义了三种滤波器:均值滤波器、中值滤波器和高斯滤波器。其中,均值滤波器使用了一个大小为 3x3 的矩阵进行计算;中值滤波器使用了 `cv2.medianBlur()` 函数进行计算,它的核心思想是取样本中的中位数代替当前像素的值;高斯滤波器使用了 `cv2.GaussianBlur()` 函数进行计算,它将当前像素周围的像素取加权平均值作为当前像素的值,权重呈现高斯分布。 最后,我们使用 `cv2.imshow()` 函数将原始图片和三种滤波器处理后的图片显示出来。注意,我们使用了 `cv2.waitKey(0)` 和 `cv2.destroyAllWindows()` 函数来等待用户按下键盘,以及销毁所有显示窗口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瑶山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值