web-dev-qa-db-ja.com

Pythonアンシャープマスク

16ビット画像にアンシャープマスクを使用したい。画像のピクセル数は640x 480ピクセルで、numpy配列で保存されます。最初のステップでは、ガウスフィルター(3つの異なる方法)を使用して画像をぼかします。この後、オリジナルからぼかし画像を差し引いてマスクを作成します。最後のステップで、マスクに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)

誰か助けてもらえますか?

10
omni

OpenCVを使用して不鮮明な画像を取得するには、次のように addWeighted 関数を使用する必要があります。

import cv2

image = cv2.imread("lenna.jpg")
gaussian_3 = cv2.GaussianBlur(image, (9,9), 10.0)
unsharp_image = cv2.addWeighted(image, 1.5, gaussian_3, -0.5, 0, image)
cv2.imwrite("lenna_unsharp.jpg", unsharp_image)

次のような結果が得られます。

enter image description here

19
Martin Evans

scikit-imageまたはPILunsharp 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()

次の出力で:

enter image description here

また、MartinEvansコードにopencv-pythonを使用して詳細なstpes /コメントを追加します。

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

2
Sandipan Dey