如何使用圖像校正濾鏡

Hairil related to 如何使用圖像校正濾鏡
海里海西米·賓·奧馬
2023年10月11日
已更新 2024年12月17日
分享:
This article was translated from English: Does it need improvement?
Translated
View the article in English

面對現實吧。 不是每個圖像都是完美的,這也是條碼圖像無法被IronBarcode讀取的主要因素之一。 這不完全是使用者的錯。 為了避免重新捕捉影像或使用其他圖像增強軟體的麻煩,IronBarcode 推出了一項功能,使用者可以以程式設計的方式對影像應用過濾器。 這將有助於IronBarcode讀取圖像並提高準確性。

繼續閱讀以了解IronBarcode中可用的圖像校正濾鏡,它們對圖像的影響,以及如何應用它們。

開始使用 IronBarcode

立即在您的專案中使用IronBarcode,並享受免費試用。

第一步:
green arrow pointer


使用影像篩選器來改善讀取範例

要應用篩選器,請實例化 ImageFilterCollection 類並分別創建每個篩選器的實例。 然後將對象指派給 BarcodeReaderOptions 對象的 ImageFilters 屬性。 將選項對象與範例圖像一起傳入Read方法。

讓我們使用下面的圖片作為我們的範例圖片。

示例圖片

從圖像的初始外觀來看,它似乎相當模糊。 然而,亮度可以接受,且白色和黑色可以辨識。 因此,我們需要至少應用SharpenFilterContrastFilter來提高條碼的可讀性。 請參考下面的程式碼片段,對圖像進行過濾,讀取它,並在控制台上顯示。

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-apply-filter.cs
using IronBarCode;
using System;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection()
    {
        new SharpenFilter(3.5f),
        new ContrastFilter(2)
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Write the result value to console
foreach (BarcodeResult result in results)
{
    Console.WriteLine(result.Text);
}
Imports IronBarCode
Imports System

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection() From {
		New SharpenFilter(3.5F),
		New ContrastFilter(2)
	}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Write the result value to console
For Each result As BarcodeResult In results
	Console.WriteLine(result.Text)
Next result
$vbLabelText   $csharpLabel

從上面的代碼片段來看,除了應用過濾器和讀取條碼外,我們還將過濾後的圖像導出到磁盤。 可以在下面看到樣本和過濾後圖像的比較。

示例圖片
過濾樣本

探索影像校正濾鏡

IronBarcode提供多種專為圖像校正設計的影像過濾器。 這些過濾器可以幫助讀取不完美的條碼圖像並提高讀取精度。 然而,用戶將需要了解這些過濾器是如何運作的才能

選擇合適的過濾器避免由於使用過多或使用錯誤的過濾器而產生的性能問題。 以下是所有可用的過濾器:

  • 自適應閾值過濾器
  • 二進位閾值濾鏡
  • 亮度濾鏡
  • ContrastFilter
  • 反相濾鏡
  • SharpenFilter
  • 模糊過濾器

    • 高斯模糊過濾器

    • 雙邊濾波器

    • 中值模糊過濾器

    套用這些濾鏡的順序取決於它們在 ImageFilterCollection 中的位置。

適應性閾值濾波器

AdaptiveThresholdFilter 是 IronBarcode 中可用的濾鏡之一,它對圖像應用Bradley Adaptive Threshold技術,這技術可以自動確定將圖像二值化的閾值。 此過濾器非常適合用於具有非均勻照明和不同背景亮度級別的圖像。

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-adaptive-threshold.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new AdaptiveThresholdFilter(0.9f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("adaptiveThreshold_0.9.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New AdaptiveThresholdFilter(0.9F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("adaptiveThreshold_0.9.png")
$vbLabelText   $csharpLabel

以下是使用不同值應用過濾器的輸出。

預設自適應臨界值
自適應閾值 0.9

此建構函數還接受其他參數進行配置:

  • 上限:用於閾值化的上限(白色)顏色。
  • Lower:用於閾值的較低(黑色)顏色。
  • 閾值:用於二值化的閾值限制(0.0-1.0)。
  • 矩形:應用處理器的矩形區域。

    如上圖所示,圖像被二值化為只有黑色白色。 雖然它看起來仍然不是理想的條碼閱讀方式,因為需要組合使用過濾器。 用戶需要試驗參數的敏感性以獲得最佳結果。

二進位閾值過濾器

BinaryThresholdFilter 透過在給定的臨界值下分割像素來過濾圖像,此時用於比較顏色組件的亮度。 與AdaptiveThresholdFilter類似,如果使用不當,此過濾器可能會引入新的或不需要的噪音。 然而,IronBarcode 已為過濾器的屬性設置了預設值。

類似於AdaptiveThresholdFilter,BinaryThresholdFilter接受相同的額外參數進行配置。

  • 上限:用於閾值化的上限(白色)顏色。
  • Lower:用於閾值的較低(黑色)顏色。
  • 閾值:用於二值化的閾值限制(0.0-1.0)。
  • 矩形:應用處理器的矩形區域。
:path=/static-assets/barcode/content-code-examples/how-to/image-correction-binary-threshold.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new BinaryThresholdFilter(0.9f)
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("binaryThreshold_0.9.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New BinaryThresholdFilter(0.9F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("binaryThreshold_0.9.png")
$vbLabelText   $csharpLabel

以下是對樣本圖片應用濾鏡的樣本輸出。

二值化預設閾值
0.9 二值化閾值

觀察上面的輸出圖像,我們可以看到樣本已被二值化為黑白顏色。 然而,可以看出這個過濾器顯然不適用於此圖像,因為條碼條被消除了,同時也引入了一些新的噪音。

亮度濾鏡

BrightnessFilter 是 IronBarcode 圖像過濾器集合中的另一個重要過濾器。 如名稱所示,此過濾器調整條碼圖像的亮度。 此建構函式的輸入可改變輸出圖像的亮度。 預設值為1,不更改圖片。 值為0將創建一個完全黑色的圖像,而值高於1將使圖像更亮。

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-brightness.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new BrightnessFilter(1.5f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("brightness_1.5.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New BrightnessFilter(1.5F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("brightness_1.5.png")
$vbLabelText   $csharpLabel

以下是將此篩選器應用於範例輸入後的輸出影像。

預設亮度
1.5 亮度

對比過濾器

對比濾鏡 用於調整圖像的對比度級別。 圖像對比是指圖像中各個元素之間的色彩強度差異。 提高對比度可以增強細節的可見性,使圖像顯得生動和鮮明,而降低對比度則使圖像顯得柔和且更加含蓄。

預設值為1,不更改圖片。 值為 0 將創建一個完全灰色的圖像,而高於 1 的值將增加圖像對比度。

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-contrast.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new ContrastFilter(1.5f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("contrast_1.5.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New ContrastFilter(1.5F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("contrast_1.5.png")
$vbLabelText   $csharpLabel

將此篩選器應用於示例輸入將生成下圖。

預設對比度
對比 1.5

反轉濾鏡

此篩選器用於反轉圖像中的顏色,使得相對的顏色顛倒,例如白色變成黑色,黑色變成白色。當用戶試圖讀取具有背景顏色的條碼圖像時,此功能特別有用。 與BinaryThresholdFilter不同,該濾鏡直接反轉顏色,不需要指定敏感度。 此外,此過濾器可以與CropRectangle一起使用,以指定圖像中需要反轉顏色的位置,而不是反轉整個圖像的顏色。

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-invert.cs
using IronBarCode;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new InvertFilter(),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("invert.png");
Imports IronBarCode

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New InvertFilter()}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("invert.png")
$vbLabelText   $csharpLabel

下面的輸出圖像是將此過濾器應用於樣本輸入圖像後的結果。

原始圖像
反轉

銳化濾鏡

IronBarcode中的最後一個圖像校正濾鏡是SharpenFilter。 此篩選器增強了圖像的銳利度,對於模糊圖像非常有用。 用戶可以透過在實例化過濾器物件時調整 Sigma 值來調整影像的銳利度。 默認值為3。增加西格瑪值以提高圖像銳度。

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-sharpen.cs
using IronBarCode;
using System;

BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new SharpenFilter(0.5f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.png", options);

// Export file to disk
results.ExportFilterImagesToDisk("sharpen_0.5.png");
Imports IronBarCode
Imports System

Private options As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New SharpenFilter(0.5F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.png", options)

' Export file to disk
results.ExportFilterImagesToDisk("sharpen_0.5.png")
$vbLabelText   $csharpLabel

下圖為示例輸入圖片的加銳版本。

預設銳化
0.5銳化

比較上面的圖像與原始圖像,它似乎更清晰,並且肯定會在使用 IronBarcode 進行條碼讀取時有所幫助。 在大多數情況下,SharpenFilter通常會與 ImageFilterCollection 類中的其他濾鏡一起應用。

模糊過濾器

高斯模糊濾鏡

GaussianBlurFilter 用於對圖像應用高斯模糊。 此濾鏡常用於減少圖像中的雜訊。

濾鏡透過使用高斯函數對圖像中鄰近像素值進行平均來運作。 該方法依賴於兩個可調因素:

  • 核心:用於平均像素的矩陣。
  • Sigma:控制模糊強度的值。

    預設的核大小為 3x3 像素,預設的 Sigma 值為 3.0,這會產生適中的模糊效果。 增加 Sigma 值將導致更強的模糊效果。 您也可以自訂內核以控制模糊濾鏡平均的鄰域大小。

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-gaussianblur.cs
using IronBarCode;

BarcodeReaderOptions myOptionsExample = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new GaussianBlurFilter(3, 3, 3.0f),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sharpen.webp", myOptionsExample);

// Export file to disk
results.ExportFilterImagesToDisk("gaussianBlur.png");
Imports IronBarCode

Private myOptionsExample As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New GaussianBlurFilter(3, 3, 3.0F)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sharpen.webp", myOptionsExample)

' Export file to disk
results.ExportFilterImagesToDisk("gaussianBlur.png")
$vbLabelText   $csharpLabel

將此篩選器應用於示例輸入將生成下圖。

預設銳化
高斯模糊圖像

雙邊濾波器

BilateralFilter 用於在保持邊緣的同時平滑圖像。 與簡單的模糊技術不同,雙邊濾波器考慮了顏色差異和像素距離,因此能有效地保護邊緣進行平滑處理。

該方法依賴於三個可調因素:

  • NeighborhoodDiameter:指定用於濾波的像素鄰域的直徑。 較大的直徑包含過濾器中的更多周圍像素。 默認值是 5。
  • SigmaColor:這表示顏色的影響。 它決定了相鄰像素之間的色差對過濾的影響程度。 較高的值意味著具有不同顏色的像素之間會有更多的相互影響。 預設值為 75.0。
  • SigmaSpace: 這代表空間影響。 它決定像素之間的距離對過濾的影響程度。 較高的值意味著距離較遠的像素之間將相互影響更多。 預設值為 75.0。
:path=/static-assets/barcode/content-code-examples/how-to/image-correction-bilateral.cs
using IronBarCode;

BarcodeReaderOptions myOptionsExample = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new BilateralFilter(5, 75, 75),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sharpen.webp", myOptionsExample);

// Export file to disk
results.ExportFilterImagesToDisk("bilateral.png");
Imports IronBarCode

Private myOptionsExample As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New BilateralFilter(5, 75, 75)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sharpen.webp", myOptionsExample)

' Export file to disk
results.ExportFilterImagesToDisk("bilateral.png")
$vbLabelText   $csharpLabel

將此篩選器應用於示例輸入將生成下圖。

預設銳化
雙側影像

中值模糊濾波器

MedianBlurFilter 是一種濾波器,用於通過將每個像素的值替換為周圍像素的中值來減少圖像中的噪點。 該濾鏡在去除噪音的同時,特別有效地保留了邊緣。

  • KernelSize: 定義用於計算中位數的每個像素周圍鄰域的大小。 該值必須是大於0的奇數。預設值為5。
:path=/static-assets/barcode/content-code-examples/how-to/image-correction-medianblur.cs
using IronBarCode;

BarcodeReaderOptions myOptionsExample = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new MedianBlurFilter(5),
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sharpen.webp", myOptionsExample);

// Export file to disk
results.ExportFilterImagesToDisk("medianBlur.png");
Imports IronBarCode

Private myOptionsExample As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {New MedianBlurFilter(5)}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sharpen.webp", myOptionsExample)

' Export file to disk
results.ExportFilterImagesToDisk("medianBlur.png")
$vbLabelText   $csharpLabel

將此篩選器應用於示例輸入將生成下圖。

預設銳化
中值模糊影像

保存迭代

當對條碼應用多個篩選器時,可能很難在每個篩選方法後查看輸出。 此功能允許儲存每個濾鏡應用後的過濾影像,按照處理順序進行。 要啟用此功能,首先將 ImageFilterCollection 構造函數的參數設為 true。 然後,使用ExportFilterImagesToDisk方法提供輸出圖像的路徑和名稱。

:path=/static-assets/barcode/content-code-examples/how-to/image-correction-save-iterations.cs
using IronBarCode;

BarcodeReaderOptions myOptionsExample = new BarcodeReaderOptions()
{
    // Choose which filters are to be applied (in order)
    ImageFilters = new ImageFilterCollection(true) {
        new SharpenFilter(3.5f),
        new AdaptiveThresholdFilter(0.5f),
        new ContrastFilter(2)
    },
};

// Apply options and read the barcode
BarcodeResults results = BarcodeReader.Read("sample.webp", myOptionsExample);

// Export file to disk
results.ExportFilterImagesToDisk("filteredImage.png");
Imports IronBarCode

Private myOptionsExample As New BarcodeReaderOptions() With {
	.ImageFilters = New ImageFilterCollection(True) From {
		New SharpenFilter(3.5F),
		New AdaptiveThresholdFilter(0.5F),
		New ContrastFilter(2)
	}
}

' Apply options and read the barcode
Private results As BarcodeResults = BarcodeReader.Read("sample.webp", myOptionsExample)

' Export file to disk
results.ExportFilterImagesToDisk("filteredImage.png")
$vbLabelText   $csharpLabel

篩選器按照程式碼的順序應用,輸出圖片反映每次迭代的結果:

  • 銳化 -> 銳化後
  • 銳化 + 自適應閾值 -> 自適應閾值後
  • 銳化 + 自適應閾值 + 對比度 -> 對比後
    示例圖片
    對比 1.5
    示例圖片
    對比 1.5

    除了ImageFilters屬性之外,使用者還可以在BarcodeReaderOptions中添加其他屬性以提高閱讀準確性,更多資訊請參閱此文章

Hairil related to 保存迭代
海里海西米·賓·奧馬
軟體工程師
和所有優秀的工程師一樣,Hairil 是一位熱衷學習的人。他正在精進自己對 C#、Python 和 Java 的知識,利用這些知識為 Iron Software 團隊的成員創造價值。Hairil 從馬來西亞的馬來西亞工藝大學加入了 Iron Software 團隊,他在那裡獲得了化學和過程工程學士學位。