目錄
- 1、itkVotingBinaryImageFilter
- 2、itkVotingBinaryHoleFillingImageFilter 洞穴充填濾波器
- 3、itkVotingBinaryIterativeHoleFillingImageFilter
- 4、itkLabelVotingImageFilter
1、itkVotingBinaryImageFilter
該類是一個基類,用于根據前景和背景像素的鄰域投票進行二值圖像處理。子類包括itkVotingBinaryHoleFillingImageFilter和itkVotingBinaryIterativeHoleFillingImageFilter。
筆記
非前景或背景的像素將保持不變。
常用的成員函數:
Set/GetRadius()
:設置/獲取用于計算中位數的鄰域半徑Set/GetForegroundValue()
:設置/獲取與二進制輸入圖像上的前景(或對象)和背景關聯的值Set/GetBackgroundValue()
:設置/獲取與二進制輸入圖像上的前景(或對象)和背景關聯的值Set/GetSurvivalThreshold()
:設置/獲取生存閾值,當鄰域 ON 的數量小于此生存閾值中定義的值時,ON 的像素將關閉Set/GetBirthThreshold()
:設置/獲取出生閾值, 當鄰域 ON 的數量大于此閾值中定義的值時,關閉的像素將打開。
2、itkVotingBinaryHoleFillingImageFilter 洞穴充填濾波器
該類主要通過對每個像素的鄰域前景像素數量進行比較,占大多數時將背景像素轉換為前景像素,來填充孔和空腔。
此類是一個針對孔洞填充的特殊情況的子類,它首先進行一次基于投票的二值圖像處理,然后基于結果的前景像素來填充孔洞。
常用的成員函數:
Set/GetMajorityThreshold()
:設置/獲取多數門檻,超過 50% 的像素數量將決定OFF像素是否變為 ON,例如,如果某個像素的鄰域有124個像素(不包括其自身),則 50% 將是 62,如果您將多數閾值設置為 5,則意味著過濾器需要67個或更多鄰域像素才能打開以便將當前關閉像素切換為打開,默認值為 1。SetSurvivalThreshold()
:保護 SetBirthThreshold() 和 SetSurvivalThreshold() 方法,以便此過濾器的用戶無法訪問它們SetBirthThreshold()
:保護 SetBirthThreshold() 和 SetSurvivalThreshold() 方法,以便此過濾器的用戶無法訪問它們GetNumberOfPixelsChanged()
:返回執行過濾器時更改的像素數Set/GetForegroundValue()
:設置/獲取與二進制輸入圖像上的前景(或對象)和背景關聯的值Set/GetBackgroundValue()
:設置/獲取與二進制輸入圖像上的前景(或對象)和背景關聯的值Set/GetRadius()
:設置/獲取用于計算鄰域半徑
示例代碼:
#include "itkImage.h"
#include "itkVotingBinaryHoleFillingImageFilter.h"typedef itk::Image<short, 3> ShortImageType;bool votingBinaryHollFillingImageFilter(ShortImageType* image, ShortImageType* outputImage)
{ShortImageType::SizeType indexRadius;indexRadius[0] = 2; // radius along xindexRadius[1] = 2; // radius along yindexRadius[2] = 2; // radius along ztypedef itk::VotingBinaryHoleFillingImageFilter<ShortImageType, ShortImageType> VBHollFillFilterType;typename VBHollFillFilterType::Pointer vBHoleFillFilter = VBHollFillFilterType::New();vBHoleFillFilter->SetInput(image);vBHoleFillFilter->SetRadius(indexRadius); //設置鄰域半徑vBHoleFillFilter->SetForegroundValue(255); //指定用來作為前景和背景的灰度vBHoleFillFilter->SetBackgroundValue(0);vBHoleFillFilter->SetMajorityThreshold(3); //表示鄰域中前景的數量至少應為(直徑*直徑-1)+MajorityThreshold值try{vBHoleFillFilter->Update();}catch (itk::ExceptionObject& ex){//讀取過程發生錯誤std::cerr << "Error: " << ex << std::endl;return false;}outputImage = vBHoleFillFilter->GetOutput();return true;
}
3、itkVotingBinaryIterativeHoleFillingImageFilter
該類是itkVotingBinaryHoleFillingImageFilter的進一步擴展。它通過多次迭代的二值圖像處理來填補漏洞和空洞。
在每次迭代中,它使用前一次迭代的結果作為輸入,并產生一個新的結果,直到達到指定的迭代次數或結果像素不再改變為止。此過濾器基于單個圖像類型進行模板化,輸出圖像類型必須與輸入圖像類型相同。
過濾器的目的是填充中等尺寸(半徑數十像素)的孔。原則上,迭代次數與要填充的孔的大小有關。孔越大,必須使用此過濾器運行更多迭代才能填充整個孔。鄰域的大小還與孔邊界的曲率以及孔的大小有關。請注意,作為附帶效果,該過濾器還可能填充結構外側的空腔。
常用的成員函數:
Set/GetRadius()
:設置/獲取用于計算鄰域半徑Set/GetMajorityThreshold()
:設置/獲取多數門檻,超過 50% 的像素數量將決定OFF像素是否變為 ON,例如,如果某個像素的鄰域有124個像素(不包括其自身),則 50% 將是 62,如果您將多數閾值設置為 5,則意味著過濾器需要67個或更多鄰域像素才能打開以便將當前關閉像素切換為打開,默認值為 1。Set/GetForegroundValue()
:設置/獲取與二進制輸入圖像上的前景(或對象)和背景關聯的值Set/GetBackgroundValue()
:設置/獲取與二進制輸入圖像上的前景(或對象)和背景關聯的值Set/GetMaximumNumberOfIterations()
:設置/獲取最大迭代次數,只要在前一次迭代中至少有一個像素發生變化,或者直到達到最大迭代次數前,會一直迭代執行該濾波器Set/GetCurrentNumberOfIterations()
:設置/獲取在任何給定時間執行的迭代次數,這在執行結束時很有用,可以驗證執行了多少次迭代GetNumberOfPixelsChanged()
:返回執行過濾器時更改的像素數
示例代碼:
#include "itkImage.h"
#include "itkVotingBinaryIterativeHoleFillingImageFilter.h"typedef itk::Image<short, 3> ShortImageType;bool votingBinaryIterativeHollFillingImageFilter(ShortImageType* image,ShortImageType* outputImage, int numberOfIterations)
{ShortImageType::SizeType indexRadius;indexRadius[0] = 2; // radius along xindexRadius[1] = 2; // radius along yindexRadius[2] = 2; // radius along ztypedef itk::VotingBinaryIterativeHoleFillingImageFilter<ShortImageType> VBIterativeHoleFillFilterType;typename VBIterativeHoleFillFilterType::Pointer vBIterHoleFillFilter = VBIterativeHoleFillFilterType::New();vBIterHoleFillFilter->SetInput(image);vBIterHoleFillFilter->SetRadius(indexRadius);vBIterHoleFillFilter->SetBackgroundValue(0);vBIterHoleFillFilter->SetForegroundValue(255);vBIterHoleFillFilter->SetMajorityThreshold(2);vBIterHoleFillFilter->SetMaximumNumberOfIterations(numberOfIterations);try{vBIterHoleFillFilter->Update();}catch (itk::ExceptionObject& ex){//讀取過程發生錯誤std::cerr << "Error: " << ex << std::endl;return false;}outputImage = vBIterHoleFillFilter->GetOutput();return true;
}
這三個類都是基于投票的二值圖像處理算法,其中itkVotingBinaryHoleFillingImageFilter和itkVotingBinaryIterativeHoleFillingImageFilter專門用于孔洞填充的應用。itkVotingBinaryHoleFillingImageFilter只進行一次處理,而itkVotingBinaryIterativeHoleFillingImageFilter可通過多次迭代來獲得更好的結果。
4、itkLabelVotingImageFilter
該類是一個像素級別的標簽融合濾波器,它根據其鄰域中的像素標簽來融合給定像素的標簽。
該濾波器通過對每個像素進行投票來實現標簽融合的操作,每個像素的鄰域中的每個像素都向指定的標簽進行投票,投票最多的標簽將成為該像素的最終標簽。如果最大投票數為不唯一,即有多個標簽具有最大投票數,則將“未決定”標簽分配給該輸出像素。
默認情況下,用于未確定像素的標簽是輸入圖像中使用的最大標簽值加一。 由于具有 8 位像素值的圖像可以使用所有 256 個可能的標簽值,因此允許將 8 位(即字節)圖像組合成 16 位(即短)輸出圖像。
與傳統的多數投票方法不同,LabelVotingImageFilter使用了一種基于距離加權的投票策略,以減少噪聲或多個標簽的不一致性。
此類的輸入圖像的像素類型應當是可比較的,支持相應的運算符,輸出圖像的像素類型可以是任何整數標量類型。
常用的成員函數:
Set/GetRadius()
:設置/獲取鄰域的半徑SetLabelForUndecidedPixels()
:設置在投票過程中未決定的像素的標簽GetLabelForUndecidedPixels()
:獲取在投票過程中未決定的像素的標簽,Update過濾器后,此函數返回用于當前輸出中未確定像素的實際標簽值,請注意,當調用SetLabelForUndecidedPixels 時,該值將被覆蓋,并且新值僅在下一次過濾器更新時生效。UnsetLabelForUndecidedPixels()
:取消未確定像素的標簽值并打開自動選擇
注意:itkLabelVotingImageFilter類的模板參數需要為無符號整數類型的像素類型,不要弄錯,否則會報錯““初始化”: 無法從“itk::Concept::IsUnsignedInteger<short>::Constraints::TrueT”轉換為“itk::Concept::Detail::UniqueType_bool<false>”
”。
示例代碼:
#include "itkImage.h"
#include "itkLabelVotingImageFilter.h"typedef itk::Image<unsigned short, 3> UnsignShortImageType;bool labelVotingImageFilter(UnsignShortImageType* image, UnsignShortImageType* outputImage, unsigned short forUndecidedPixels)
{typedef itk::LabelVotingImageFilter<UnsignShortImageType, UnsignShortImageType> LabelVotingFilterType;typename LabelVotingFilterType::Pointer labelVotingFilter = LabelVotingFilterType::New();labelVotingFilter->SetInput(image);labelVotingFilter->SetLabelForUndecidedPixels(forUndecidedPixels);try{labelVotingFilter->Update();}catch (itk::ExceptionObject& ex){//讀取過程發生錯誤std::cerr << "Error: " << ex << std::endl;return false;}outputImage = labelVotingFilter->GetOutput();return true;}