private static byte[] MedianFilter(this byte[] pixelBuffer,
int imageWidth,
int imageHeight,
int filterSize)
{
byte[] resultBuffer = new byte[pixelBuffer.Length];
int filterOffset = (filterSize - 1) / 2;
int calcOffset = 0;
int stride = imageWidth * pixelByteCount;
int byteOffset = 0;
var neighbourCount = filterSize * filterSize;
int medianIndex = neighbourCount / 2;
var blueNeighbours = new byte[neighbourCount];
var greenNeighbours = new byte[neighbourCount];
var redNeighbours = new byte[neighbourCount];
for (int offsetY = filterOffset; offsetY <
imageHeight - filterOffset; offsetY++)
{
for (int offsetX = filterOffset; offsetX <
imageWidth - filterOffset; offsetX++)
{
byteOffset = offsetY *
stride +
offsetX * pixelByteCount;
for (int filterY = -filterOffset, neighbour = 0;
filterY <= filterOffset; filterY++)
{
for (int filterX = -filterOffset;
filterX <= filterOffset; filterX++, neighbour++)
{
calcOffset = byteOffset +
(filterX * pixelByteCount) +
(filterY * stride);
blueNeighbours[neighbour] = pixelBuffer[calcOffset];
greenNeighbours[neighbour] = pixelBuffer[calcOffset + greenOffset];
redNeighbours[neighbour] = pixelBuffer[calcOffset + redOffset];
}
}
Array.Sort(blueNeighbours);
Array.Sort(greenNeighbours);
Array.Sort(redNeighbours);
resultBuffer[byteOffset] = blueNeighbours[medianIndex];
resultBuffer[byteOffset + greenOffset] = greenNeighbours[medianIndex];
resultBuffer[byteOffset + redOffset] = redNeighbours[medianIndex];
resultBuffer[byteOffset + alphaOffset] = maxByteValue;
}
}
return resultBuffer;
}
int imageWidth,
int imageHeight,
int filterSize)
{
byte[] resultBuffer = new byte[pixelBuffer.Length];
int filterOffset = (filterSize - 1) / 2;
int calcOffset = 0;
int stride = imageWidth * pixelByteCount;
int byteOffset = 0;
var neighbourCount = filterSize * filterSize;
int medianIndex = neighbourCount / 2;
var blueNeighbours = new byte[neighbourCount];
var greenNeighbours = new byte[neighbourCount];
var redNeighbours = new byte[neighbourCount];
for (int offsetY = filterOffset; offsetY <
imageHeight - filterOffset; offsetY++)
{
for (int offsetX = filterOffset; offsetX <
imageWidth - filterOffset; offsetX++)
{
byteOffset = offsetY *
stride +
offsetX * pixelByteCount;
for (int filterY = -filterOffset, neighbour = 0;
filterY <= filterOffset; filterY++)
{
for (int filterX = -filterOffset;
filterX <= filterOffset; filterX++, neighbour++)
{
calcOffset = byteOffset +
(filterX * pixelByteCount) +
(filterY * stride);
blueNeighbours[neighbour] = pixelBuffer[calcOffset];
greenNeighbours[neighbour] = pixelBuffer[calcOffset + greenOffset];
redNeighbours[neighbour] = pixelBuffer[calcOffset + redOffset];
}
}
Array.Sort(blueNeighbours);
Array.Sort(greenNeighbours);
Array.Sort(redNeighbours);
resultBuffer[byteOffset] = blueNeighbours[medianIndex];
resultBuffer[byteOffset + greenOffset] = greenNeighbours[medianIndex];
resultBuffer[byteOffset + redOffset] = redNeighbours[medianIndex];
resultBuffer[byteOffset + alphaOffset] = maxByteValue;
}
}
return resultBuffer;
}
No comments:
Post a Comment