private static byte[] MinMaxEdgeDetection(this byte[] sourceBuffer,
int imageWidth,
int imageHeight,
int filterSize,
bool smoothNoise = false,
bool grayscale = false)
{
byte[] pixelBuffer = sourceBuffer;
if (smoothNoise)
{
pixelBuffer = sourceBuffer.MedianFilter(imageWidth,
imageHeight,
filterSize);
}
byte[] resultBuffer = new byte[pixelBuffer.Length];
int filterOffset = (filterSize - 1) / 2;
int calcOffset = 0;
int stride = imageWidth * pixelByteCount;
int byteOffset = 0;
byte minBlue = 0, minGreen = 0, minRed = 0;
byte maxBlue = 0, maxGreen = 0, maxRed = 0;
for (int offsetY = filterOffset; offsetY <
imageHeight - filterOffset; offsetY++)
{
for (int offsetX = filterOffset; offsetX <
imageWidth - filterOffset; offsetX++)
{
byteOffset = offsetY *
stride +
offsetX * pixelByteCount;
minBlue = maxByteValue;
minGreen = maxByteValue;
minRed = maxByteValue;
maxBlue = minByteValue;
maxGreen = minByteValue;
maxRed = minByteValue;
for (int filterY = -filterOffset;
filterY <= filterOffset; filterY++)
{
for (int filterX = -filterOffset;
filterX <= filterOffset; filterX++)
{
calcOffset = byteOffset +
(filterX * pixelByteCount) +
(filterY * stride);
minBlue = Math.Min(pixelBuffer[calcOffset], minBlue);
maxBlue = Math.Max(pixelBuffer[calcOffset], maxBlue);
minGreen = Math.Min(pixelBuffer[calcOffset + greenOffset], minGreen);
maxGreen = Math.Max(pixelBuffer[calcOffset + greenOffset], maxGreen);
minRed = Math.Min(pixelBuffer[calcOffset + redOffset], minRed);
maxRed = Math.Max(pixelBuffer[calcOffset + redOffset], maxRed);
}
}
if (grayscale)
{
resultBuffer[byteOffset] = ByteVal((maxBlue - minBlue) * 0.114 +
(maxGreen - minGreen) * 0.587 +
(maxRed - minRed) * 0.299);
resultBuffer[byteOffset + greenOffset] = resultBuffer[byteOffset];
resultBuffer[byteOffset + redOffset] = resultBuffer[byteOffset];
resultBuffer[byteOffset + alphaOffset] = maxByteValue;
}
else
{
resultBuffer[byteOffset] = (byte)(maxBlue - minBlue);
resultBuffer[byteOffset + greenOffset] = (byte)(maxGreen - minGreen);
resultBuffer[byteOffset + redOffset] = (byte)(maxRed - minRed);
resultBuffer[byteOffset + alphaOffset] = maxByteValue;
}
}
}
return resultBuffer;
}
int imageWidth,
int imageHeight,
int filterSize,
bool smoothNoise = false,
bool grayscale = false)
{
byte[] pixelBuffer = sourceBuffer;
if (smoothNoise)
{
pixelBuffer = sourceBuffer.MedianFilter(imageWidth,
imageHeight,
filterSize);
}
byte[] resultBuffer = new byte[pixelBuffer.Length];
int filterOffset = (filterSize - 1) / 2;
int calcOffset = 0;
int stride = imageWidth * pixelByteCount;
int byteOffset = 0;
byte minBlue = 0, minGreen = 0, minRed = 0;
byte maxBlue = 0, maxGreen = 0, maxRed = 0;
for (int offsetY = filterOffset; offsetY <
imageHeight - filterOffset; offsetY++)
{
for (int offsetX = filterOffset; offsetX <
imageWidth - filterOffset; offsetX++)
{
byteOffset = offsetY *
stride +
offsetX * pixelByteCount;
minBlue = maxByteValue;
minGreen = maxByteValue;
minRed = maxByteValue;
maxBlue = minByteValue;
maxGreen = minByteValue;
maxRed = minByteValue;
for (int filterY = -filterOffset;
filterY <= filterOffset; filterY++)
{
for (int filterX = -filterOffset;
filterX <= filterOffset; filterX++)
{
calcOffset = byteOffset +
(filterX * pixelByteCount) +
(filterY * stride);
minBlue = Math.Min(pixelBuffer[calcOffset], minBlue);
maxBlue = Math.Max(pixelBuffer[calcOffset], maxBlue);
minGreen = Math.Min(pixelBuffer[calcOffset + greenOffset], minGreen);
maxGreen = Math.Max(pixelBuffer[calcOffset + greenOffset], maxGreen);
minRed = Math.Min(pixelBuffer[calcOffset + redOffset], minRed);
maxRed = Math.Max(pixelBuffer[calcOffset + redOffset], maxRed);
}
}
if (grayscale)
{
resultBuffer[byteOffset] = ByteVal((maxBlue - minBlue) * 0.114 +
(maxGreen - minGreen) * 0.587 +
(maxRed - minRed) * 0.299);
resultBuffer[byteOffset + greenOffset] = resultBuffer[byteOffset];
resultBuffer[byteOffset + redOffset] = resultBuffer[byteOffset];
resultBuffer[byteOffset + alphaOffset] = maxByteValue;
}
else
{
resultBuffer[byteOffset] = (byte)(maxBlue - minBlue);
resultBuffer[byteOffset + greenOffset] = (byte)(maxGreen - minGreen);
resultBuffer[byteOffset + redOffset] = (byte)(maxRed - minRed);
resultBuffer[byteOffset + alphaOffset] = maxByteValue;
}
}
}
return resultBuffer;
}
No comments:
Post a Comment