對兩張圖片進行矩陣運算會怎麼樣?
在學習《線性代數》的矩陣運算時,突然想到圖片也可以算是一種矩陣,那麼對圖片進行矩陣的運算會出現什麼樣的效果呢?為了滿足好奇,便用C#寫了個對圖片進行矩陣運算的程式。
矩陣加:
Bitmap C = new Bitmap(imgA.Width,imgA.Height);
for (int i=0;i<imgA.Width; i++)
{
for(int j=0;j<imgA.Height;j++)
{
Color A = imgA.GetPixel(i, j), B = imgB.GetPixel(i, j);
int r = A.R + B.R;
int g = A.G + B.G;
int b = A.B + B.B;
Color colC = Color.FromArgb(r%256,g%256,b%256);
C.SetPixel(i, j, colC);
}
}
pictureBox3.Image = C;
這是兩個圖片經過矩陣加法運算後的結果,由於直接加會使RGB大於255,因此在運算後,我們對256進行取模運算,避免越界。
矩陣減:
Bitmap C = new Bitmap(imgA.Width, imgA.Height);
for (int i = 0; i < imgA.Width; i++)
{
for (int j = 0; j < imgA.Height; j++)
{
Color A = imgA.GetPixel(i, j), B = imgB.GetPixel(i, j);
int r = A.R - B.R;
int g = A.G - B.G;
int b = A.B - B.B;
Color colC = Color.FromArgb(Math.Abs(r) % 256, Math.Abs(g) % 256, Math.Abs(b) % 256);
C.SetPixel(i, j, colC);
}
}
pictureBox3.Image = C;
由於減法運算時,可能使圖片RGB小於0,因此我們對運算後的結果進行Abs()運算,取其絕對值。
矩陣乘
MessageBox.Show((imgA.Width * imgB.Height * Math.Min(imgA.Height, imgB.Width)).ToString());
Bitmap C = new Bitmap(imgA.Width, imgB.Height);
for (int i = 0; i < imgA.Width; i++)
{
for (int j = 0; j < imgB.Height; j++)
{
int r=0, g=0, b=0;
for(int k =0;k<Math.Min(imgA.Height,imgB.Width);k++)
{
Color A = imgA.GetPixel(i, k), B = imgB.GetPixel(k, j);
r += A.R * B.R;
g += A.G * B.G;
b += A.B * B.B;
}
Color colC = Color.FromArgb(r % 256, g % 256, b % 256);
//Console.WriteLine(i.ToString()+","+j.ToString()+":"+colC.ToString());
C.SetPixel(i, j, colC);
}
}
pictureBox3.Image = C;
由於複雜度為O(N^3),正常圖片沒跑出來,因此用PS新建了兩張50*50的小圖片,成功跑出來了,結果發現全是噪點,比隨機還隨機。。。