我需要3x3通過迭代并計算每個像素的新值來手動將掩碼 () 應用于影像。我的代碼似乎可以作業,但有一個問題 - 新值可能不在 0 到 255 之間,它可以更高或更低。這樣的值是不可接受的。現在我不知道如何正確解決它。
顯然標準化到 0-255 會起作用,但是在這里我需要標準化整個回圈完成后已知的值集。這意味著我需要遍歷整個影像兩次。
您還可以評價我的代碼,也許可以改進一些東西,盡管編譯和創建處理后的影像,它實際上可能無法正常作業。
public Image<Rgba32> ApplyMask3x3(int[,] mask, Image<Rgba32> image)
{
Image<Rgba32> result = new Image<Rgba32>(image.Width, image.Height);
for(int row = 0; row < image.Height; row )
{
for(int col = 0; col < image.Width; col )
{
byte R = 0, G = 0, B = 0;
//temporary - forcefully throw new values to 0-255
int valR = ApplyMaskR3x3(col, row, image, mask); //code below
int valG = ApplyMaskG3x3(col, row, image, mask); //identical code as R but uses G attribute
int valB = ApplyMaskB3x3(col, row, image, mask); //identical code as R but uses B attribute
if (valR > 255) valR = 255;
if (valR < 0) valR = 0;
if (valG > 255) valG = 255;
if (valG < 0) valG = 0;
if (valB > 255) valB = 255;
if (valB < 0) valB = 0;
R = Convert.ToByte(valR);
G = Convert.ToByte(valG);
B = Convert.ToByte(valB); ;
result[col, row] = new Rgba32(R,G,B);
}
}
return result;
}
private int ApplyMaskR3x3(int col, int row, Image<Rgba32> image, int[,] mask)
{
int a, b, c;
int d, e, f;
int g, h, i;
if (col == 0 || row == 0)
a = 0;
else
a = image[col - 1, row - 1].R * mask[0, 0];
if (row == 0)
b = 0;
else
b = image[col, row - 1].R * mask[0, 1];
if (row == 0 || col == image.Width - 1)
c = 0;
else
c = image[col 1, row - 1].R * mask[0, 2];
if (col == 0)
d = 0;
else
d = image[col - 1, row].R * mask[1, 0];
e = image[col, row].R * mask[1, 1];
if (col == image.Width - 1)
f = 0;
else
f = image[col 1, row].R * mask[1, 2];
if (col == 0 || row == image.Height - 1)
g = 0;
else
g = image[col - 1, row 1].R * mask[2, 0];
if (row == image.Height - 1)
h = 0;
else
h = image[col, row 1].R * mask[2, 1];
if (col == image.Width - 1 || row == image.Height - 1)
i = 0;
else
i = image[col 1, row 1].R * mask[2, 2];
return a b c d e f g h i;
}
uj5u.com熱心網友回復:
您應該能夠使用FilterImageSharp 內置的處理器
從您的代碼示例中,您應該能夠做到這一點
public Image<Rgba32> ApplyMask3x3(int[,] mask, Image<Rgba32> image)
{
var matrix = new ColorMatrix(
mask[0,0],
mask[0,1],
mask[0,2],
mask[1,0],
mask[1,1],
mask[1,2],
mask[2,0],
mask[2,1],
mask[2,2]
);
image.Mutate(x=>x.Filter(matrix));
return image;
}
如果您確實需要第二張影像并且不想就地變異,請替換為.Mutate()。.Clone()
如果您Clone需要確保正確處理源影像和輸出影像,否則最終可能會導致記憶體問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/442585.html
下一篇:區分具有相似顏色的附加物件
