Python不锐化掩模

16

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

该图像具有640 x 480像素,保存在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)
2个回答

31

要使用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)

给出以下结果:

mandrill unsharp example

此处使用addWeighted()函数:

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

给你以下的转换:

dst = src1*alpha + src2*beta + gamma

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


1
那不是高斯滤波器,而是接近于均匀滤波器。请参考我的这篇旧博客文章进行解释。相反,使用cv2.GaussianBlur(image, (0,0), 10.0)来让OpenCV计算出正确的内核大小。但是,对于这个目的来说,10的sigma值太大了,建议改为1或2。 - Cris Luengo
有很好的论据表明,马达里猴彩椒图像可能更能促进多样性和尊重。 - EngrStudent

4

您也可以使用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的代码:
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()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接