python图像锐化_Python图像处理介绍--图像模糊与锐化
歡迎關(guān)注?“小白玩轉(zhuǎn)Python”,發(fā)現(xiàn)更多 “有趣”
引言
在之前的文章中,我們討論了邊緣檢測(cè)內(nèi)核。在本文我們將討論如何在圖像上應(yīng)用模糊與銳化內(nèi)核,將這些內(nèi)核應(yīng)用到彩色圖像上,同時(shí)保留核心圖像。
一如既往,我們從導(dǎo)入所需的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);
現(xiàn)在我們應(yīng)用于圖像的內(nèi)核是高斯模糊內(nèi)核和銳化內(nèi)核。
# 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()];
但我們?nèi)绾螌⑦@些內(nèi)核應(yīng)用到我們的圖像中呢?那么,讓我們直接通過卷積來試試。
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)
很顯然,我們出現(xiàn)了維數(shù)錯(cuò)誤。當(dāng)我們將一個(gè)矩陣與另一個(gè)矩陣卷積時(shí),它們的維數(shù)應(yīng)該是相同的。因此,我們必須先將圖像轉(zhuǎn)化為灰度。
dog_grey = rgb2gray(dog)
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(dog_grey);
現(xiàn)在我們可以運(yùn)行上面的卷積函數(shù)并得到預(yù)期的效果。
convolved_image = multi_convolver(dog_grey, gaussian, 2)
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(convolved_image);
我們可以清楚的看到,圖像已經(jīng)模糊了。下面的代碼將告訴我們?nèi)绻^續(xù)運(yùn)行高斯模糊卷積圖像會(huì)發(fā)生什么。
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)
可以看到圖像變得越來越模糊了。
如果需要使圖像模糊并保留顏色怎么辦?讓我們首先嘗試對(duì)每個(gè)顏色通道應(yīng)用卷積。
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)
上面這個(gè)函數(shù)實(shí)際上將給我們返回重新生成的圖像,我們只需要將其插入到imshow函數(shù)中即可。
plt.figure(num=None, figsize=(8, 6), dpi=80)
imshow(convolved_rgb_gauss);
讓我們看看卷積十次后圖像會(huì)變成什么樣。
現(xiàn)在讓我們嘗試下更換銳化內(nèi)核會(huì)發(fā)生什么。
convolved_rgb_sharpen = convolver_rgb(dog, sharpen, 1)
處理后的圖像有一些輕微的扭曲,為什么會(huì)這樣呢?
請(qǐng)記住,RGB顏色空間隱式地將像素的光照與顏色混合。這意味著在不改變顏色的情況下對(duì)圖像的光照應(yīng)用卷積幾乎是不可能的。那么我們?nèi)绾翁幚磉@個(gè)問題呢?
解決此問題的一種方法是更改圖像的色彩空間。除了使用RGB顏色空間外,我們還可以使用YUV顏色空間。因?yàn)閅UV空間中的光照通道實(shí)際上是與顏色分開的。
現(xiàn)在我們編寫一個(gè)函數(shù),它首先將圖像轉(zhuǎn)換為YUV色彩空間,然后對(duì)圖像進(jìn)行卷積。
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)
現(xiàn)在可以看到,處理后的圖像是明顯銳化且沒有任何顏色扭曲的。還有許多其他的方法來解決這個(gè)問題,YUV轉(zhuǎn)換只是其中之一,我們還可以使用HSV來解決這個(gè)問題。
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有了一些改進(jìn)。為了更好地說明,我們可以將迭代次數(shù)從1增加到2。
在2次迭代后,失真變得更加明顯。但是也很清楚,HSV和Y'UV調(diào)整后的圖像比原始RGB調(diào)整后的圖像要好得多。在選擇將卷積內(nèi)核應(yīng)用于圖像的最佳方法時(shí),應(yīng)當(dāng)牢記這些特性。
總結(jié)
在本文中,我們已經(jīng)學(xué)會(huì)了如何對(duì)圖像進(jìn)行模糊和銳化卷積。這些技術(shù)對(duì)于任何從事圖像處理和計(jì)算機(jī)視覺領(lǐng)域的人員都是至關(guān)重要的。非常重要的是,我們了解到,簡單地將卷積應(yīng)用到各個(gè)RGB通道可能不是最好的方法。在處理圖像時(shí),我們應(yīng)該始終意識(shí)到有大量不同類型的色彩空間可以使用。
·? END? ·
HAPPY?LIFE
總結(jié)
以上是生活随笔為你收集整理的python图像锐化_Python图像处理介绍--图像模糊与锐化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 进程池 等待数量_【202
- 下一篇: python编程游戏代码 游戏人物如何升