【发布时间】:2015-01-02 04:49:25
【问题描述】:
我在 C++ 和 C# 中看到了许多 Sobel 边缘检测操作,但我在将代码转换为在 16 位图形上操作时遇到了很大的困难。我见过的大部分代码都被编程为在 R.G.B 风格的位图上运行。我拥有的图形在一个 ushort[] 数组中,每行都有强度值,col 像素。
以下是我得出的代码:(问题是,它不太工作......)有了一个软糖因素,它可能正在寻找边缘,但它也发现了很多噪音。
但是,如果我将原始文件保存为 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 是给定的。您会注意到一些已注释掉的其他尝试。
【问题讨论】:
标签: c# image image-processing graphics edge-detection