python图像锐化_Python图像处理介绍--图像模糊与锐化
歡迎關注?“小白玩轉Python”,發現更多 “有趣”
引言
在之前的文章中,我們討論了邊緣檢測內核。在本文我們將討論如何在圖像上應用模糊與銳化內核,將這些內核應用到彩色圖像上,同時保留核心圖像。
一如既往,我們從導入所需的python庫開始。
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imshow, imread
from skimage.color import rgb2yuv, rgb2hsv, rgb2gray, yuv2rgb, hsv2rgb
from scipy.signal import convolve2d
讀取本文將使用的圖像。
dog = imread('fire_dog.png')
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(dog);
現在我們應用于圖像的內核是高斯模糊內核和銳化內核。
# Sharpen
sharpen = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
# Gaussian Blur
gaussian = (1 / 16.0) * np.array([[1., 2., 1.],
[2., 4., 2.],
[1., 2., 1.]])
fig, ax = plt.subplots(1,2, figsize = (17,10))
ax[0].imshow(sharpen, cmap='gray')
ax[0].set_title(f'Sharpen', fontsize = 18)
ax[1].imshow(gaussian, cmap='gray')
ax[1].set_title(f'Gaussian Blur', fontsize = 18)
[axi.set_axis_off() for axi in ax.ravel()];
但我們如何將這些內核應用到我們的圖像中呢?那么,讓我們直接通過卷積來試試。
def multi_convolver(image, kernel, iterations):
for i in range(iterations):
image = convolve2d(image, kernel, 'same', boundary = 'fill',
fillvalue = 0)
return image
multi_convolver(dog, gaussian, 2)
很顯然,我們出現了維數錯誤。當我們將一個矩陣與另一個矩陣卷積時,它們的維數應該是相同的。因此,我們必須先將圖像轉化為灰度。
dog_grey = rgb2gray(dog)
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(dog_grey);
現在我們可以運行上面的卷積函數并得到預期的效果。
convolved_image = multi_convolver(dog_grey, gaussian, 2)
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(convolved_image);
我們可以清楚的看到,圖像已經模糊了。下面的代碼將告訴我們如果繼續運行高斯模糊卷積圖像會發生什么。
def convolution_plotter(image, kernel):
iterations = [1,10,20,30]
f_size = 20
fig, ax = plt.subplots(1,4, figsize = (15,7))
for n, ax in enumerate(ax.flatten()):
ax.set_title(f'Iteration : {iterations[n]}', fontsize =
f_size)
ax.imshow(multi_convolver(image, kernel, iterations[n]),
cmap='gray')
ax.set_axis_off()
fig.tight_layout()
convolution_plotter(dog_grey, gaussian)
可以看到圖像變得越來越模糊了。
如果需要使圖像模糊并保留顏色怎么辦?讓我們首先嘗試對每個顏色通道應用卷積。
def convolver_rgb(image, kernel, iterations = 1):
convolved_image_r = multi_convolver(image[:,:,0], kernel,
iterations)
convolved_image_g = multi_convolver(image[:,:,1], kernel,
iterations)
convolved_image_b = multi_convolver(image[:,:,2], kernel,
iterations)
reformed_image = np.dstack((np.rint(abs(convolved_image_r)),
np.rint(abs(convolved_image_g)),
np.rint(abs(convolved_image_b)))) /
255
fig, ax = plt.subplots(1,3, figsize = (17,10))
ax[0].imshow(abs(convolved_image_r), cmap='Reds')
ax[0].set_title(f'Red', fontsize = 15)
ax[1].imshow(abs(convolved_image_g), cmap='Greens')
ax[1].set_title(f'Green', fontsize = 15)
ax[2].imshow(abs(convolved_image_b), cmap='Blues')
ax[2].set_title(f'Blue', fontsize = 15)
[axi.set_axis_off() for axi in ax.ravel()]
return np.array(reformed_image).astype(np.uint8)
convolved_rgb_gauss = convolver_rgb(dog, gaussian, 2)
上面這個函數實際上將給我們返回重新生成的圖像,我們只需要將其插入到imshow函數中即可。
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(convolved_rgb_gauss);
讓我們看看卷積十次后圖像會變成什么樣。
現在讓我們嘗試下更換銳化內核會發生什么。
convolved_rgb_sharpen = convolver_rgb(dog, sharpen, 1)
處理后的圖像有一些輕微的扭曲,為什么會這樣呢?
請記住,RGB顏色空間隱式地將像素的光照與顏色混合。這意味著在不改變顏色的情況下對圖像的光照應用卷積幾乎是不可能的。那么我們如何處理這個問題呢?
解決此問題的一種方法是更改圖像的色彩空間。除了使用RGB顏色空間外,我們還可以使用YUV顏色空間。因為YUV空間中的光照通道實際上是與顏色分開的。
現在我們編寫一個函數,它首先將圖像轉換為YUV色彩空間,然后對圖像進行卷積。
def convolver_rgb(image, kernel, iterations = 1):
img_yuv = rgb2yuv(image)
img_yuv[:,:,0] = multi_convolver(img_yuv[:,:,0], kernel,
iterations)
final_image = yuv2rgb(img_yuv)
fig, ax = plt.subplots(1,2, figsize = (17,10))
ax[0].imshow(image)
ax[0].set_title(f'Original', fontsize = 20)
ax[1].imshow(final_image);
ax[1].set_title(f'YUV Adjusted, Iterations = {iterations}',
fontsize = 20)
[axi.set_axis_off() for axi in ax.ravel()]
fig.tight_layout()
return final_image
final_image = convolver_rgb(dog, sharpen, iterations = 1)
現在可以看到,處理后的圖像是明顯銳化且沒有任何顏色扭曲的。還有許多其他的方法來解決這個問題,YUV轉換只是其中之一,我們還可以使用HSV來解決這個問題。
def convolver_comparison(image, kernel, iterations = 1):
img_yuv = rgb2yuv(image)
img_yuv[:,:,0] = multi_convolver(img_yuv[:,:,0], kernel,
iterations)
final_image_yuv = yuv2rgb(img_yuv)
img_hsv = rgb2hsv(image)
img_hsv[:,:,2] = multi_convolver(img_hsv[:,:,2], kernel,
iterations)
final_image_hsv = hsv2rgb(img_hsv)
convolved_image_r = multi_convolver(image[:,:,0], kernel,
iterations)
convolved_image_g = multi_convolver(image[:,:,1], kernel,
iterations)
convolved_image_b = multi_convolver(image[:,:,2], kernel,
iterations)
final_image_rgb = np.dstack((np.rint(abs(convolved_image_r)),
np.rint(abs(convolved_image_g)),
np.rint(abs(convolved_image_b)))) /
255
fig, ax = plt.subplots(2,2, figsize = (17,17))
ax[0][0].imshow(image)
ax[0][0].set_title(f'Original', fontsize = 30)
ax[0][1].imshow(final_image_rgb);
ax[0][1].set_title(f'RGB Adjusted, Iterations = {iterations}',
fontsize = 30)
fig.tight_layout()
ax[1][0].imshow(final_image_yuv)
ax[1][0].set_title(f'YUV Adjusted, Iterations = {iterations}',
fontsize = 30)
ax[1][1].imshow(final_image_hsv)
ax[1][1].set_title(f'HSV Adjusted, Iterations = {iterations}',
fontsize = 30)
[axi.set_axis_off() for axi in ax.ravel()]
fig.tight_layout()
convolver_comparison(dog, sharpen, iterations = 1)
我們看到,與原始RGB方法相比,HSV和YUV有了一些改進。為了更好地說明,我們可以將迭代次數從1增加到2。
在2次迭代后,失真變得更加明顯。但是也很清楚,HSV和Y'UV調整后的圖像比原始RGB調整后的圖像要好得多。在選擇將卷積內核應用于圖像的最佳方法時,應當牢記這些特性。
總結
在本文中,我們已經學會了如何對圖像進行模糊和銳化卷積。這些技術對于任何從事圖像處理和計算機視覺領域的人員都是至關重要的。非常重要的是,我們了解到,簡單地將卷積應用到各個RGB通道可能不是最好的方法。在處理圖像時,我們應該始終意識到有大量不同類型的色彩空間可以使用。
·? END? ·
HAPPY?LIFE
總結
以上是生活随笔為你收集整理的python图像锐化_Python图像处理介绍--图像模糊与锐化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 进程池 等待数量_【202
- 下一篇: python编程游戏代码 游戏人物如何升