【问题标题】:Python unsharp maskPython 锐化蒙版
【发布时间】:2015-12-03 22:48:54
【问题描述】:

我想在 16 位图像上使用 unsharp mask

Image 有640 x 480 Pixels 并保存在 NumPy 数组中。

我做了以下事情:

  • 使用Gaussian filter 模糊图像(三种不同的方法)
  • 然后,通过从原始图像中减去模糊图像来创建蒙版
  • 最后,将乘以WightFaktor的掩码添加到原始图像中

但它并没有真正起作用。

这是 Python 代码:

Gaussian1 = ndimage.filters.gaussian_filter(Image,sigma=10.0)
Gaussian2 = filters.gaussian_filter(Image,sigma=10.0)
Gaussian3 = cv2.GaussianBlur(Image,(9,9),sigmaX=10.0)

Mask1 = Image - Gaussian1
UnsharpImage = Image + (WightFaktor*Mask1)

【问题讨论】:

    标签: python opencv numpy image-processing gaussian


    【解决方案1】:

    要使用OpenCV 获得不清晰的图像,您需要使用addWeighted 函数,如下所示:

    import cv2
    
    image = cv2.imread("example.jpg")
    gaussian_3 = cv2.GaussianBlur(image, (0, 0), 2.0)
    unsharp_image = cv2.addWeighted(image, 2.0, gaussian_3, -1.0, 0)
    cv2.imwrite("example_unsharp.jpg", unsharp_image)
    

    给出以下结果:

    addWeighted()在这里使用如下:

    dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
    

    给你以下变换:

    dst = src1*alpha + src2*beta + gamma
    

    可以通过调整alphabeta 的权重来改变效果的强度,例如:1.5-0.5

    【讨论】:

    • 这不是高斯滤波器,它接近于均匀滤波器。有关说明,请参阅 this old blog post of mine。相反,使用cv2.GaussianBlur(image, (0,0), 10.0) 让 OpenCV 计算内核的正确大小。但是 10 的 sigma 对于此目的来说太大了,请尝试 1 或 2。
    • 有很好的论据 link 表明 mandrillpeppers 可能更鼓励多样性和尊重。
    【解决方案2】:

    也可以使用scikit-imagePILunsharp mask 实现:

    import numpy as np
    import matplotlib.pylab as plt
    from PIL import Image, ImageFilter
    from skimage.io import imread
    from skimage.filters import unsharp_mask
    # with scikit-image
    im = imread('images/lena.jpg')
    im1 = np.copy(im).astype(np.float)
    for i in range(3):
        im1[...,i] = unsharp_mask(im[...,i], radius=2, amount=2)
    # with PIL
    im = Image.open('images/lena.jpg')
    im2 = im.filter(ImageFilter.UnsharpMask(radius=2, percent=150))
    # plot
    plt.figure(figsize=(20,7))
    plt.subplot(131), plt.imshow(im), plt.axis('off'), plt.title('Original', size=20)
    plt.subplot(132), plt.imshow(im1), plt.axis('off'), plt.title('Sharpened (skimage)', size=20)
    plt.subplot(133), plt.imshow(im2), plt.axis('off'), plt.title('Sharpened (PIL)', size=20)
    plt.show()
    

    输出如下:

    另外,使用opencv-python在 Martin Evans 代码上添加一些详细的 stpes / cmets:

    import cv2
    
    im = cv2.imread("images/lena.jpg")
    im_blurred = cv2.GaussianBlur(im, (11,11), 10)
    im1 = cv2.addWeighted(im, 1.0 + 3.0, im_blurred, -3.0, 0) # im1 = im + 3.0*(im - im_blurred)
    plt.figure(figsize=(20,10))
    plt.subplot(121),plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB)), plt.axis('off'), plt.title('Original Image', size=20)
    plt.subplot(122),plt.imshow(cv2.cvtColor(im1, cv2.COLOR_BGR2RGB)), plt.axis('off'), plt.title('Sharpened Image', size=20)
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2010-10-21
      • 2017-08-29
      相关资源
      最近更新 更多