python去掉模糊图片

 python去掉模糊图片

import os
import cv2
import shutil
class item:  # (图片, 图片清晰度) 结构体
    def __init__(self):
        self.name = ''     # 图片名称
        self.val = 10     # 图片清晰度 也就是 getImageVar(img)
 
#利用拉普拉斯   利用拉普拉斯算子计算图片的二阶导数,反映图片的边缘信息,同样事物的图片,清晰度高的,相对应的经过拉普拉斯算子滤波后的图片的方差也就越大
def getImageVar(imgPath):
    image = cv2.imread(imgPath)
    img2gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    imageVar = cv2.Laplacian(img2gray, cv2.CV_64F).var()
    return imageVar
 
 
if __name__ == "__main__":
    src_img_dir = r"E:\photo\images"
    move_img_dir = r"E:\photo\images3" #存储移出去的模糊图片
    os.makedirs(move_img_dir, exist_ok=True)
    img_files = os.listdir(src_img_dir)
    print("len(img_files): ", len(img_files))
    a_list = []
    for i in range(len(img_files)):
        img_file_path = os.path.join(src_img_dir, img_files[i])
        imageVar = getImageVar(img_file_path)
        # print(imageVar)
        a = item()
        a.val = imageVar
        a.name = img_files[i]
        a_list.append(a)
    print("len(a_list): ", len(a_list))
 
    a_list.sort(key=lambda ita: ita.val, reverse=False) # 对 (图片, 图片清晰度) 结构体 列表 按照 图片清晰度排序, 模糊的放在列表头部, 清晰的放在列表尾部
 
    count = 0
    for i in range(int(len(a_list)*0.1)): # 移除最模糊的 %10 的图片
        print(a_list[i].name, a_list[i].val)
        src_path = os.path.join(src_img_dir, a_list[i].name)
        dest_path = os.path.join(move_img_dir, a_list[i].name)
        shutil.move(src_path, dest_path)
        count += 1
        # break
    print("count: ", count)

去除图片的高斯模糊是一个复杂的逆问题,通常涉及图像去模糊技术。这类技术的目标是从模糊的图像中恢复原始清晰的图像。以下是关于如何使用 Python 实现这一目标的一些详细说明: ### 去除高斯模糊的技术背景 图像去模糊可以分为两类:盲去模糊和非盲去模糊。 - **非盲去模糊**假设已知具体的模糊核(例如高斯核),并尝试基于此核重建原图。 - **盲去模糊**则试图估计未知的模糊核,并在此基础上进行图像恢复。 对于高斯模糊的情况,由于其模糊核通常是已知的,因此属于非盲去模糊范畴[^1]。 --- ### 使用 Wiener 滤波器实现去模糊 Wiener 滤波器是一种经典的去模糊算法,在 OpenCV 和 SciPy 中都有相应的实现。它可以用来减少噪声影响的同时尽可能还原原始图像。 #### 示例代码 ```python import cv2 import numpy as np from scipy.signal import wiener # 加载带有高斯模糊的图像 blurred_image = cv2.imread('gaussian_blur_image.jpg', cv2.IMREAD_GRAYSCALE) # 应用 Wiener 滤波器 restored_image = wiener(blurred_image, (5, 5)) # 显示结果 cv2.imshow('Restored Image', restored_image.astype(np.uint8)) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码利用 `scipy.signal.wiener` 函数实现了简单的 Wiener 滤波器应用。参数 `(5, 5)` 表示滤波窗口大小,可以根据实际需求调整[^2]。 --- ### 利用 Richardson-Lucy 算法 Richardson-Lucy 是一种迭代式的非盲去模糊方法,特别适合于处理由特定模糊核引起的退化图像。该方法需要提供一个模糊核作为输入。 #### 示例代码 ```python import cv2 import numpy as np from skimage.restoration import richardson_lucy # 定义高斯模糊核 psf_size = 9 psf = np.zeros((psf_size, psf_size), dtype=np.float32) cv2.GaussianBlur(np.eye(psf_size, dtype=np.float32), (psf_size, psf_size), sigmaX=2.5, dst=psf) # 加载带有高斯模糊的图像 blurred_image = cv2.imread('gaussian_blur_image.jpg', cv2.IMREAD_GRAYSCALE).astype(float) / 255.0 # 应用 Richardson-Lucy 算法 deblurred_image = richardson_lucy(blurred_image, psf, iterations=30) # 转换回 uint8 类型以便显示 deblurred_image_uint8 = (np.clip(deblurred_image, 0, 1) * 255).astype(np.uint8) # 显示结果 cv2.imshow('Deblurred Image', deblurred_image_uint8) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这段代码定义了一个高斯模糊核 (`psf`) 并将其传递给 `richardson_lucy` 方法以执行去模糊操作。注意,迭代次数会影响最终效果,可根据实际情况调整[^4]。 --- ### 注意事项 1. 图像去模糊的效果很大程度上依赖于模糊核的质量以及是否存在其他类型的干扰(如噪声)。 2. 如果模糊核不准确,则可能导致伪影或其他失真现象。 3. 对于复杂场景下的模糊(如运动模糊或混合模糊),可能需要更高级的方法,比如深度学习模型[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值