您也可以使用scikit-image
或PIL
的unsharp 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
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)
im = Image.open('images/lena.jpg')
im2 = im.filter(ImageFilter.UnsharpMask(radius=2, percent=150))
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()
以下是输出结果:
![输入图像描述](https://istack.dev59.com/Tnlr5.webp)
另外,使用
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)
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](https://istack.dev59.com/CSnXU.webp)
cv2.GaussianBlur(image, (0,0), 10.0)
来让OpenCV计算出正确的内核大小。但是,对于这个目的来说,10的sigma值太大了,建议改为1或2。 - Cris Luengo