[英]Sobel Edge Detection output for 16bit grayscale image
我已經看到了許多用C ++和C#進行的Sobel邊緣檢測操作,但是將代碼轉換為可在16位圖形上進行操作非常困難。 我見過的大多數代碼都被編程為在RGB樣式位圖上運行。 我擁有的圖形在ushort []數組中,每行以像素為單位,包含強度值。
以下是我提供的代碼:(問題是,它不太起作用...)在設置了軟糖因素的情況下,它可能正在發現邊緣,但同時也發現了很多噪音。
但是,如果我將原始文件另存為JPG,然后將其運行到接受位圖的另一種Sobel-Edge-Detector C#代碼中,那就更好了……幾乎沒有噪音! 我的16位灰度版本應該更好嗎? 但這一定是我的代碼還不夠完善。 我不了解邏輯。
public void sobel()
{
ushort[] pixels = new ushort[9];
ushort[,] imageData = image_array[0].GetArray();
ushort[,] imageOut = (ushort[,])imageData.Clone();
uint xDim = (ushort)(imageData.GetLength(1) - imageData.GetLength(1) % regions);
uint yDim = (ushort)(imageData.GetLength(0) - imageData.GetLength(0) % regions);
double intensityX = 0.0;
double intensityY = 0.0;
double intensityTotal = 0.0;
int limit = 1000000; //Just arbitrary junk number
int filterOffset = 1;
for (int offsetY = filterOffset; offsetY <
yDim - (filterOffset+1); offsetY++)
{
for (int offsetX = filterOffset; offsetX <
xDim - (filterOffset+1); offsetX++)
{
//intensityX = intensityY = 0;
//intensityTotal = 0;
pixels[0] = imageData[offsetY - 1, offsetX - 1];
pixels[1] = imageData[offsetY - 1, offsetX];
pixels[2] = imageData[offsetY - 1, offsetX + 1];
pixels[3] = imageData[offsetY, offsetX - 1];
pixels[4] = imageData[offsetY, offsetX];
pixels[5] = imageData[offsetY, offsetX + 1];
pixels[6] = imageData[offsetY + 1, offsetX - 1];
pixels[7] = imageData[offsetY + 1, offsetX];
pixels[8] = imageData[offsetY + 1, offsetX + 1];
intensityX = pixels[8] + 2 * pixels[5] + pixels[2] - pixels[0] - 2 * pixels[3] - pixels[6];
intensityY = pixels[8] + 2 * pixels[7] + pixels[6] - pixels[2] - 2 * pixels[1] - pixels[0];
//intensityTotal = Math.Sqrt((intensityX * intensityX) + (intensityY * intensityY));
//intensityTotal = Math.Abs(intensityX) + Math.Abs(intensityY);
intensityTotal = intensityX * intensityX + intensityY * intensityY;
//int sobel = (int)Math.Sqrt((xSobel * xSobel) + (ySobel * ySobel));
//if (intensityTotal > MaximumValue)
// intensityTotal = MaximumValue; //Presumably Black
//if (intensityTotal < -1000) //1000 fudgefactor ...still not working correctly
// intensityTotal = MinimumValue; //Presumably White
//if (intensityTotal < (MinimumValue - 1000))
// intensityTotal = MaximumValue;
if (intensityTotal > limit)
imageOut[offsetY, offsetX] = MinimumValue;
else
imageOut[offsetY, offsetX] = MaximumValue;
//imageOut[offsetY, offsetX] = (ushort)intensityTotal;
}
}
SetImageArrayItem(ImageDataIndex.RAWData, new DiskBackedArray(imageOut));
}
只需假設給出了“ image_array”,xDim,yDim。 您會注意到一些注釋掉了其他嘗試。
Sobel(和其他基於梯度的濾波器)受到噪聲的影響。 您可以使用高斯平滑對圖片進行預過濾並比較結果。 請注意,平方差的limit = 1000000
對應於約1000的差異大小-對於16位(MAX = 65535)圖片而言,這是一個很小的值。
保存為JPG將使圖片更加模糊-塗上銳利的邊緣,降低高頻噪聲。 因此,請使用適度的平滑度和限制來發揮作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.