# C#影像分析note ## visual studio ## 原圖轉灰階 灰階轉換公式: $(R * 313524 + G * 615514 + B * 119538) >> 20$ or $(R*30 + G*59 + B*11 + 50) / 100$ ```csharp= private void button2_Click(object sender, EventArgs e) { Bitmap im0 = new Bitmap(pictureBox1.Image); int W = im0.Width, H = im0.Height; Bitmap imgary = new Bitmap(W, H); for (int y = 0; y < H; y++) { for (int x = 0; x < W; x++) { Color p0 = im0.GetPixel(x, y); int R = p0.R, G = p0.G, B = p0.B; int gary = (R * 313524 + G * 615514 + B * 119538) >> 20; Color p1 = Color.FromArgb(gary, gary, gary); imgary.SetPixel(x, y, p1); } } imgary.Save("Gary.png"); pictureBox2.Image = imgary; pictureBox2.SizeMode = PictureBoxSizeMode.Zoom; } ``` ## 灰階轉二值圖 ### 二值化: 圖像二值化做的事情為將圖片每個像素點的灰階值設為0或255,讓每個像素不是全白就是全黑。以便分析輪廓。 最常採用的方法為**閥值法**,像素大於閥值就全黑,反之全黑 可分為全局閥值和局部閥值。 #### 全局閥值 對整個圖像中的每個像素用相同的閥值, 優點: 速度較快 缺點: 遇到光照不平均...會出現一大片黑色區域 1.平均灰度值法 : 以圖像中所有像素灰度值的平均作為閥值。 ```csharp= private void button3_Click_1(object sender, EventArgs e) { Bitmap imgary = new Bitmap(pictureBox2.Image); int W = imgary.Width,H = imgary.Height; Bitmap imbinary = new Bitmap(W, H); int average = 0; for(int y = 0; y < H; y++) { for(int x = 0; x < W; x++) { Color color = imgary.GetPixel(x, y); average += color.B; } } average = (int)average / (W * H); for (int y = 0; y < H; y++) { for (int x = 0; x < W; x++) { Color color = imgary.GetPixel(x, y); int v = 255 - color.B; Color nowcolor = (v > average ? Color.FromArgb(0, 0, 0) : Color.FromArgb(255, 255, 255)); imbinary.SetPixel(x, y, nowcolor); } } pictureBox3.Image = imbinary; pictureBox3.SizeMode = PictureBoxSizeMode.Zoom; } ``` 2.大津法 把圖像直方圖用某一灰階值分割成兩類,分別計算這兩類的像素點數和灰階平均值,並計算他們的類間方差,當被分割成的兩類類間方差最大時,此灰度值就作爲圖像二值化處理的閾值。 #### 局部閥值 也可稱自適應閥值,局部閾值法假定圖像在一定區域內受到的光照比較接近。它用一個滑窗掃描圖像,並取滑窗中心點亮度與滑窗內其他區域(稱為鄰域, neighborhood area)的亮度進行比較。如果中心點亮度高於鄰域亮度,則將中心點標記為白色,否則標記為黑色。 優點: 可解決光照不平均問題 缺點: 速度較慢 --- ### 參考資料: https://zhuanlan.zhihu.com/p/360824614 http://hk.noobyard.com/article/p-wteozwxj-ov.html ###### tags: `影像分析`