# 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: `影像分析`