生活随笔
收集整理的這篇文章主要介紹了
数字图像处理与Python实现笔记之空间滤波
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數字圖像處理與Python實現筆記之空間濾波
- 摘要
- 緒論
- 1 數字圖像處理基礎知識
- 2 彩色圖像處理初步
- 3 空間濾波
- 3.1 空間濾波基礎
- 3.1.1 空間濾波的機理
- 3.1.2 空間濾波器模板
- 3.2 平滑處理
- 3.2.1 平滑線性空間濾波器
- 3.2.2 統計排序濾波器
- 3.3 銳化處理
- 3.3.1 一階微分算子
- 3.3.2 二階微分算子
- 3.3.3 反銳化掩蔽
- 3.4 混合空間增強
- 3.5 小結
- 參考資料
摘要
簡要介紹數字圖像處理涉及的一些基本概念、基本運算、基本類型,以及如何通過Python對數字圖像進行讀取和簡單操作。以彩色圖像為例對數字圖像處理的基本操作進行介紹,熟悉數字圖像處理的基本過程,主要包括顏色空間的基本概念、偽彩色圖像處理操作,彩色圖像處理簡單操作。瞄準在空間域中對圖像進行增強,介紹空間濾波的機理、基本概念以及使用的基本技術。本章內容包括空間濾波基本概念、基于空間濾波的圖像平滑處理、基于空間濾波的銳化操作以及混合空間增強。從頻域角度入手對圖像處理及增強方法展開介紹。因為頻域濾波所需的數學知識較多,所以本章采取由淺入深的策略,首先介紹一維傅里葉變換,其次介紹二維傅里葉變換和快速傅里葉變換,最后介紹圖像頻域濾波中出現的各種技術,其大體可分為低通濾波和高通濾波兩大類。從全局特征提取和局部特征提取兩方面入手,分別介紹顏色特征、紋理特征、形狀特征、邊緣特征、點特征的提取方法。本章內容是目前機器視覺和圖像處理領域的學者關注較多的內容,通過穿插較多的實例,幫助讀者理解圖像特征提取的基本技術。瞄準如何減少圖像傳輸及存儲數據大小,介紹主要使用的壓縮技術,包括有損壓縮和無損壓縮等,并使用JPEG壓縮技術串講全章知識點。介紹圖像的小波域表示及多分辨率表示。
緒論
-
人工智能是引領未來發展的戰略性技術,是新一輪科技革命和產業變革的重要驅動力量,將深刻地改變人類社會生活。
-
促進人工智能和實體經濟的深度融合,構建數據驅動、人機協同、跨界融合、共創分享的智能經濟形態,更是推動質量變革、效率變革、動力變革的重要途經。
-
進年來,我國人工智能新技術、新產品、新業態持續涌現,與農業、制造業、服務業等行業的融合步伐明顯加快,在技術創新、應用推廣、產業發展等方面成效初顯。
-
人工智能技術并不是一個新生事物,它在最近幾年引起全球性關注并得到飛速發展的主要原因,在于它的三個基本要素(算法、數據、算力)的迅猛發展,其中又以數據和算力的發展尤為重要。
-
物聯網技術的蓬勃發展使得數據累計的難度越來越低,而芯片算力的不斷提升,使得過去只能通過云計算才能完成的人工智能運算,現在可以下沉到最普通的設備上完成。
-
物聯網技術為機器帶來感知能力,而人工智能則通過計算算力為機器帶來了決策能力,正如感知和大腦對自然生命進化所起到的必然性作用。
1 數字圖像處理基礎知識
https://hulin.blog.csdn.net/article/details/107570020
2 彩色圖像處理初步
https://hulin.blog.csdn.net/article/details/107578369
3 空間濾波
- 空間濾波是在圖像平面本身上逐像素的移動空間模板,同時空間模板與其覆蓋的圖像像素灰度值按預定義的關系進行運算。模板也稱空間濾波器、核、掩膜或窗口。
- 空間濾波器一般用于去除圖像噪聲或增強圖像細節,突出感興趣信息,抑制無效信息,改善人類的視覺效果,或是圖像更適合于機器感知或分析。
- 空間濾波主要分為平滑處理和銳化處理兩大類。
- 平滑處理主要用于處理圖像中一些不重要的細節,并減小噪聲。
- 銳化處理主要為了突出圖像中的細節,增強圖像邊緣。
- 為了達到滿意的圖像增強效果,通常使用多種互補的濾波技術。
3.1 空間濾波基礎
- 空間域指的是圖像平面本身,是相對于變換域而言的。
- 空間域的圖像處理是圖像本身不進行頻域變換,以圖像中的像素為基礎對圖像進行處理。
- 空間域的圖像處理是在像素的領域進行操作,如空間域平滑處理是通過像素的領域平滑圖像,空間域銳化處理是通過像素的領域銳化圖像。
- 頻域的圖像處理首先將圖像變換到變換域,然后在頻域進行處理,處理之后將其變換到空間域。
- 頻域處理主要包括低通濾波和高通濾波。
- 低通濾波可以使低頻信號正常通過,而高于所設定的臨界值的高頻信號被阻隔或者減弱,可用于去除圖像的噪聲,相當于空間域的平滑處理。
- 高通濾波可以使高頻信號正常通過,而低于所設定的臨界值的低頻信號被阻隔或者減弱,可增強圖像邊緣輪廓等高頻信號,相當于空間域的銳化處理。
- 在頻域處理中,濾波是指過濾一些頻率分量,即通過一些頻率分量,同時拒絕一些頻率分量的通過。
- 頻域濾波器主要包括低通濾波器和高通濾波器。
- 濾波也可用于空間域即空間域濾波,在空間域上直接對圖像進行處理,實現類似頻域的平滑或銳化處理。
3.1.1 空間濾波的機理
- 空間濾波的機理就是在待處理的圖像上逐像素的移動模板,在每個像素點,濾波器的響應通過事先定義的計算。
- 若濾波器在圖像像素上執行的是線性操作,則稱為線性濾波器,否則稱為非線性濾波器。
- 均值濾波器求解的是模板內像素灰度值的平均值,是典型的線性濾波器。
- 統計排序濾波器是通過比較給定鄰域內的灰度值大小實現的。原始數據與濾波結果是一種邏輯關系,如最大值濾波器,最小值濾波器,中值濾波器都是典型的非線性濾波器。
- 3*3模板的線性空間濾波器的機理
- 矩陣進行線性空間濾波處理的代碼如下。
from skimage
import data
, color
, io
from matplotlib
import pyplot
as plt
import numpy
as np
def corre12d(img
, window
):m
= window
.shape
[0]n
= window
.shape
[1]img_border
= np
.zeros
((img
.shape
[0] + m
- 1, img
.shape
[1] + n
- 1))img_border
[(m
- 1) // 2:(img
.shape
[0] + (m
- 1) // 2), (n
- 1) // 2:(img
.shape
[1] + (n
- 1) // 2)] = imgimg_result
= np
.zeros
(img
.shape
)for i
in range(img_result
.shape
[0]):for j
in range(img_result
.shape
[1]):temp
= img_border
[i
:i
+ m
, j
:j
+ n
]img_result
[i
, j
] = np
.sum(np
.multiply
(temp
, window
))return img_border
, img_result
window
= np
.array
([[1, 0, 0], [0, 0, 0], [0, 0, 2]])
img
= np
.array
([[1, 2, 1, 0, 2, 3], [0, 1, 1, 2, 0, 1],[3, 0, 2, 1, 2, 2], [0, 1, 1, 0, 0, 1],[1, 1, 3, 2, 2, 0], [0, 0, 1, 0, 1, 0]])
img_border
, img_result
= corre12d
(img
, window
)
3.1.2 空間濾波器模板
- m*n的線性濾波器模板有m*n個模板系數,這些系數決定了線性空間濾波器的功能。假設要實現3x3的平滑空間濾波器,較簡單的方法是使得濾波器的系數均為1/9。
3.2 平滑處理
- 平滑處理常用于模糊處理和降低噪聲。
- 平滑濾波器使用給定鄰域內像素的平均灰度值或邏輯運算值代替原始圖像中像素的灰度值,這種處理降低了圖像灰度的尖銳變化。
- 圖像邊緣也是由圖像灰度尖銳變化帶來的特性,因此平滑空間濾波器有邊緣模糊化的負面效應。
3.2.1 平滑線性空間濾波器
- 平滑線性空間濾波器的輸出是給定鄰域內的像素灰度值的簡單平均值或加權平均值。
- 平滑線性空間濾波器有時也稱均值濾波器,均值濾波器的一個重要應用就是降低圖像中的噪聲,還有去除圖像的不相關細節,使不相關細節與背景糅合在一起,從而使感興趣目標更加容易檢測,此時模板的大小與不相關細節的尺寸有關。
import numpy
as np
from scipy
import signal
from skimage
import data
, io
from matplotlib
import pyplot
as plt
def correl2d(img
, window
):"""使用濾波器實現圖像的空間相關mode='same' 表示輸出尺寸等于輸入尺寸boundary=‘fill’ 表示濾波前,用常量值填充原始圖像的邊緣,默認常量值為0:param img::param window::return:"""s
= signal
.correlate2d
(img
, window
, mode
='same', boundary
='fill')return s
.astype
(np
.uint8
)img
= data
.camera
()
window1
= np
.ones
((3, 3)) / (3 ** 2)
window2
= np
.ones
((5, 5)) / (5 ** 2)
window3
= np
.ones
((9, 9)) / (9 ** 2)
img1
= correl2d
(img
, window1
)
img2
= correl2d
(img
, window2
)
img3
= correl2d
(img
, window3
)plt
.figure
()
plt
.imshow
(img
)plt
.figure
()
plt
.imshow
(img1
)plt
.figure
()
plt
.imshow
(img2
)plt
.figure
()
plt
.imshow
(img3
)plt
.show
()
import numpy
as np
from scipy
import signal
from skimage
import data
, io
from matplotlib
import pyplot
as plt
import math
def correl2d(img
, window
):"""使用濾波器實現圖像的空間相關mode='same' 表示輸出尺寸等于輸入尺寸boundary=‘fill’ 表示濾波前,用常量值填充原始圖像的邊緣,默認常量值為0:param img::param window::return:"""s
= signal
.correlate2d
(img
, window
, mode
='same', boundary
='fill')return s
.astype
(np
.uint8
)
def gauss(i
, j
, sigma
):return 1 / (2 * math
.pi
* sigma
** 2) * math
.exp
(-(i
** 2 + j
** 2) / (2 * sigma
** 2))
def gauss_window(radius
, sigma
):window
= np
.zeros
((radius
* 2 + 1, radius
* 2 + 1))for i
in range(-radius
, radius
+ 1):for j
in range(-radius
, radius
+ 1):window
[i
+ radius
][j
+ radius
] = gauss
(i
, j
, sigma
)return window
/ np
.sum(window
)img
= data
.camera
()
window1
= gauss_window
(3, 1.0)
window2
= gauss_window
(5, 1.0)
window3
= gauss_window
(9, 1.0)
img1
= correl2d
(img
, window1
)
img2
= correl2d
(img
, window2
)
img3
= correl2d
(img
, window3
)plt
.figure
()
plt
.imshow
(img
, cmap
='gray')plt
.figure
()
plt
.imshow
(img1
, cmap
='gray')plt
.figure
()
plt
.imshow
(img2
, cmap
='gray')plt
.figure
()
plt
.imshow
(img3
, cmap
='gray')plt
.show
()
- 使用相同尺寸的模板,高斯濾波后圖像被平滑的程度較低。
- 高斯濾波的輸出是鄰域像素的加權,同時距離中心越近的像素權重越大。
- 與盒狀濾波相比,高斯濾波的平滑效果更柔和,圖像中感興趣目標的細節保留更好。
3.2.2 統計排序濾波器
- 統計排序濾波器是典型的非線性平滑濾波器。首先對模板覆蓋的灰度值進行排序,選擇有代表性的灰度值,作為統計排序濾波器的響應。
- 典型的統計排序濾波器包括最大值濾波器、中值濾波器、最小值濾波器。
- 最大值濾波器用像素鄰域內的最大值代替該像素的灰度值,主要用于尋找亮點。
- 中值濾波器用像素鄰域內的中值代替該像素的灰度值,主要用于降噪。
- 最小值濾波器用像素鄰域內的最小值代替該像素的灰度值,主要用于尋找最暗點。
- 對于一定類型的隨機噪聲,中值濾波器的降噪效果較好,比相同尺寸的均值濾波器模糊程度明顯要低。
- 中值濾波器對處理脈沖噪聲非常有效,因為中值濾波器取中值作為濾波結果,可以很好的去除濾波器覆蓋的鄰域中的一些黑點和白點。
- 中值濾波器使圖像中突出的亮點或暗點更像周圍的值,以消除孤立的亮點或暗點,從而實現對圖像的平滑。
- 為觀察中值濾波的降噪效果,首先對宇航員的圖像加入脈沖噪聲,然后使用3*3中值濾波器對圖像進行中值濾波。
from scipy
import ndimage
from skimage
import util
, data
from matplotlib
import pyplot
as pltimg
= data
.astronaut
()[:, :, 0]
noise_img
= util
.random_noise
(img
, mode
='s&p', seed
=None, clip
=True)
n
= 3
new_img
= ndimage
.median_filter
(noise_img
, (n
, n
))plt
.figure
()
plt
.axis
('off')
plt
.imshow
(img
, cmap
='gray') plt
.figure
()
plt
.axis
('off')
plt
.imshow
(noise_img
, cmap
='gray') plt
.figure
()
plt
.axis
('off')
plt
.imshow
(new_img
, cmap
='gray') plt
.show
()
- 顯示原始圖像
- 顯示加噪圖像
- 顯示去噪圖像
- 對RGB圖像的空間濾波,相當于分別對3個通道的圖像進行空間濾波。
from scipy
import ndimage
from skimage
import util
, data
from matplotlib
import pyplot
as plt
import numpy
as npimg
= data
.astronaut
()noise_img
= np
.zeros
(img
.shape
)
new_img
= np
.zeros
(img
.shape
)
for i
in range(3):gray_img
= img
[:, :, i
]noise_img
[:, :, i
] = util
.random_noise
(gray_img
, mode
='s&p', seed
=None, clip
=True)n
= 3new_img
[:, :, i
] = ndimage
.median_filter
(noise_img
[:, :, i
], (n
, n
))plt
.figure
()
plt
.axis
('off')
plt
.imshow
(img
, cmap
='gray') plt
.figure
()
plt
.axis
('off')
plt
.imshow
(noise_img
, cmap
='gray') plt
.figure
()
plt
.axis
('off')
plt
.imshow
(new_img
, cmap
='gray') plt
.show
()
from scipy
import ndimage
from skimage
import util
, data
from matplotlib
import pyplot
as plt
import numpy
as npimg
= data
.astronaut
()[:, :, 0]
pepper_img
= util
.random_noise
(img
, mode
='pepper', seed
=None, clip
=True)
salt_img
= util
.random_noise
(img
, mode
='salt', seed
=None, clip
=True)
n
= 3
max_img
= ndimage
.maximum_filter
(pepper_img
, (n
, n
))
min_img
= ndimage
.minimum_filter
(salt_img
, (n
, n
))plt
.figure
()
plt
.axis
('off')
plt
.imshow
(img
, cmap
='gray') plt
.figure
()
plt
.axis
('off')
plt
.imshow
(pepper_img
, cmap
='gray') plt
.figure
()
plt
.axis
('off')
plt
.imshow
(salt_img
, cmap
='gray') plt
.figure
()
plt
.axis
('off')
plt
.imshow
(max_img
, cmap
='gray') plt
.figure
()
plt
.axis
('off')
plt
.imshow
(min_img
, cmap
='gray') plt
.show
()
-
顯示加胡椒噪聲圖像
-
顯示加鹽粒噪聲圖像
-
顯示最大值濾波圖像
-
顯示最小值濾波圖像
3.3 銳化處理
- 銳化處理的目的就是增強圖像中目標的細節、邊緣、輪廓和其他灰度突變,削弱了灰度變化緩慢的區域。
- 由于微分是對函數的局部變化率的一種描述,因此圖像銳化算法的實現可基于空間微分。
- 圖像平滑處理有邊緣和細節模糊的負面效應。
- 圖像平滑和圖像銳化在邏輯上是相反的操作,可以使用原始圖像減去平滑處理后的圖像實現銳化處理,稱為反銳化掩蔽。
3.3.1 一階微分算子
- 對于任何一階微分的定義都必須滿足以下兩點:①在灰度不變的區域,微分值為0;②在灰度變化的區域微分值非0.由于處理的是離散的情況,微分用差分近似。
- 根據羅伯特的觀點,邊緣探測器應具有以下特性:產生的邊緣應清晰;背景盡可能減少噪聲;邊緣強度盡可能接近人類的感知。求羅伯特邊緣圖像和梯度圖像的代碼如下。
from skimage
import data
, filters
from matplotlib
import pyplot
as pltimg
= data
.camera
()
img_robert_pos
= filters
.roberts_pos_diag
(img
)
img_robert_neg
= filters
.roberts_neg_diag
(img
)
img_robert
= filters
.roberts
(img
)
plt
.figure
()
plt
.imshow
(img
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img
, cmap
='gray')
plt
.show
()
-
原始圖像
-
羅伯特正對角線邊緣圖像
-
羅伯特負對角線邊緣圖像
-
羅伯特梯度圖像
-
求索貝爾邊緣圖像和梯度圖像的代碼如下。
from skimage
import data
, filters
from matplotlib
import pyplot
as pltimg
= data
.camera
()
img_sobel_h
= filters
.sobel_h
(img
)
img_sobel_v
= filters
.sobel_v
(img
)
img_sobel
= filters
.sobel
(img
)
plt
.figure
()
plt
.imshow
(img
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img_sobel_h
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img_sobel_v
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img_sobel
, cmap
='gray')
plt
.show
()
-
水平Sobel邊緣圖像
-
豎直Sobel邊緣圖像
-
Sobel梯度圖像
3.3.2 二階微分算子
- 任意二階微分的定義都必須滿足以下兩點:在灰度不變的區域微分值為0;在灰度臺階或者斜坡的起點處微分值非0;沿著斜坡的微分值為0。
- 對原始圖像使用拉普拉斯算子進行空間濾波可得到拉普拉斯圖像,將拉普拉斯圖像以一定的比例疊加到該原始圖像,該比例系數的符號與拉普拉斯模板中心系數的符號一致,可對原始圖像進行拉普拉斯銳化增強,代碼如下。
from skimage
import data
, filters
from matplotlib
import pyplot
as pltimg
= data
.camera
()
img_laplace
= filters
.laplace
(img
, ksize
=3, mask
=None)
img_enhance
= img
+ img_laplace
plt
.figure
()
plt
.imshow
(img
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img_laplace
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img_enhance
, cmap
='gray')
plt
.show
()
3.3.3 反銳化掩蔽
- 圖像平滑處理有邊緣和細節模糊的負面效應,因此可用原始圖像減去平滑處理后的圖像實現銳化處理,稱為反銳化掩蔽。
- 反銳化掩蔽分為3個步驟:首先通過平滑濾波得到模糊圖像,然后從原始圖像中減去差值圖像,最后將差值圖像疊加到原始圖像中。
from skimage
import data
, filters
from matplotlib
import pyplot
as plt
from scipy
import signal
import numpy
as np
def correlate2d(img
, window
):s
= signal
.correlate2d
(img
, window
, mode
='same', boundary
='fill')return simg
= data
.camera
()
window
= np
.ones
((3, 3)) / (3 ** 2)
img_blur
= correlate2d
(img
, window
)
img_edge
= img
- img_blur
img_enhance
= img
+ img_edge
plt
.figure
()
plt
.imshow
(img
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img_blur
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img_edge
, cmap
='gray')
plt
.show
()
plt
.figure
()
plt
.imshow
(img_enhance
, cmap
='gray')
plt
.show
()
3.4 混合空間增強
- 混合空間增強就是利用平滑濾波器、銳化濾波器、灰度拉伸等對圖像進行處理,得到更為理想的顯示效果。
- 由于人體全身骨骼掃描圖像的灰度動態范圍很窄,并且有很大的噪聲內容,因此使用單一的濾波器對其進行增強效果一般。
- 首先使用拉普拉斯銳化方法突出圖像中的小細節,然后使用索貝爾梯度處理方法突出圖像的邊緣,并使用平滑的梯度圖像用于掩蔽拉普拉斯銳化增強圖像,最后使用灰度冪律變換增強圖像的灰度動態范圍。
- 人體全身骨骼掃描圖像的混合空間增強流程。
- 具體流程描述如下:第一步,對原始圖像進行拉普拉斯銳化,得到拉普拉斯銳化圖像;第二步,將原始圖像與拉普拉斯銳化圖像相加,得到拉普拉斯銳化圖像增強;第三步,對原始圖像進行索貝爾算子梯度處理,得到索貝爾圖像;第四步,使用5*5均值濾波器對索貝爾圖像進行平滑,得到平滑的索貝爾圖像;第五步,將拉普拉斯銳化增強圖像與平滑索貝爾圖像相乘,得到掩蔽圖像;第六步,將原始圖像與隱蔽圖像相加,得到銳化增強圖像;第七步,對銳化增強圖像進行灰度冪律變換,得到最終結果。
from skimage
import data
, filters
, io
from matplotlib
import pyplot
as plt
import numpy
as np
def correlate2d(img
, window
):m
= window
.shape
[0]n
= window
.shape
[1]img1
= np
.zeros
((img
.shape
[0] + m
- 1, img
.shape
[1] + n
- 1))img1
[(m
- 1) // 2:(img
.shape
[0] + (m
- 1) // 2), (n
- 1) // 2:(img
.shape
[1] + (n
- 1) // 2)] = imgimg2
= np
.zeros
(img
.shape
)for i
in range(img2
.shape
[0]):for j
in range(img2
.shape
[1]):temp
= img1
[i
:i
+ m
, j
:j
+ n
]img2
[i
, j
] = np
.sum(np
.multiply
(temp
, window
))return img2img
= io
.imread
('boneScan.jpg', as_gray
=True)
window
= np
.array
([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]])
img_laplace
= correlate2d
(img
, window
)
img_laplace
= 255 * (img_laplace
- img_laplace
.min()) / (img_laplace
.max() - img_laplace
.min())
img_laplace_enhance
= img
+ img_laplace
img_sobel
= filters
.sobel
(img
)
window_mean
= np
.ones
((5, 5)) / (5 ** 2)
img_sobel_mean
= correlate2d
(img_sobel
, window_mean
)
img_mask
= img_laplace_enhance
* img_sobel_mean
img_sharp_enhance
= img
+ img_mask
img_enhance
= img_sharp_enhance
** 0.5
imgList
= [img
, img_laplace
, img_laplace_enhance
, img_sobel
, img_sobel_mean
, img_mask
, img_sharp_enhance
, img_enhance
]
for grayImg
in imgList
:plt
.figure
()plt
.axis
('off')plt
.imshow
(grayImg
, cmap
='gray')plt
.show
()
3.5 小結
- 本章對空間濾波進行了簡要介紹。
- 講述了空間濾波的基礎知識,詳細講解了空間濾波的機理,介紹了空間濾波模板。
- 空間濾波主要包括平滑處理和銳化處理。
參考資料
岳亞偉《數字圖像處理與Python實現》人民郵電出版社
總結
以上是生活随笔為你收集整理的数字图像处理与Python实现笔记之空间滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。