前言
圖片處理是開發過程中經常遇到和要處理的問題,畢竟圖片是比較耗系統資源,網絡資源,存儲空間。。。,因此,圖片的處理顯得格外重要,去百度查閱資料,就會看到很多關于讀片處理的方法,以及圖片的加載框架,他們都是用來處理圖片的。
常見的圖片處理方式大概有如下幾類。比如圖片的等比縮放,圖片海量加載,圖片的裁剪,圖片的無損壓縮,圖片的旋轉,圖片實現畫中畫,圖片實現陰影,改變圖片形狀等
然后,這些操作只是符合日常需求開發,如果涉及的高深的算法層面就不太實用,自己在做人臉識別項目中親自體驗常規處理真的難以解決高難度問題。今天,我介紹一下其他類型的圖片處理算法。首先,我們需要了解倆個概念RGB和ARGB。
01
**RGB和ARGB**
**RGB**
RGB色彩模式使用RGB模型為圖像中每個像素的RGB分量分配一個0~255范圍內的強度值。RGB圖像僅僅使用三種顏色,R(red)、G(green)、B(blue),就能夠使它們依照不同的比例混合,在屏幕上呈現16777216(256 * 256 * 256)種顏色。
在電腦中,RGB的所謂“多少”就是指亮度,并使用整數來表示。通常情況下,RGB各有256級亮度,用數字表示為從0、1、2…直到255。
**ARGB**
一種色彩模式,也就是RGB色彩模式附加上Alpha(透明度)通道,常見于32位位圖的存儲結構。
ARGB—Alpha,Red,Green,Blue.
知道了這倆個概念,就可以了解更多較深層次的圖片處理算法了。下面我介紹一下自己在做人臉識別中常用到的算法。
02
**灰度化**
在RGB模型中,假設R=G=B時,則彩色表示一種灰度顏色,當中R=G=B的值叫灰度值,因此,灰度圖像每一個像素僅僅需一個字節存放灰度值(又稱強度值、亮度值),灰度范圍為0-255。一般有下面四種方法對彩色圖像進行灰度化,詳細方法參考csdn大牛博客,講的非常好。
03
**二值化**
一幅圖像包含目標物體、背景還有噪聲,要想從多值的數字圖像中直接提取出目標物體,最經常使用的方法就是設定一個全局的閾值T,用T將圖像的數據分成兩部分:大于T的像素群和小于T的像素群。將大于T的像素群的像素值設定為白色(或者黑色),小于T的像素群的像素值設定為黑色(或者白色)。
比方:計算每個像素的(R+G+B)/3,假設>127,則設置該像素為白色,即R=G=B=255;否則設置為黑色,即R=G=B=0。
簡單實現代碼如下:
{
Bitmap bitImage = new Bitmap(pictureBox1.Image);//二值化pictureBox1中的圖片
Color c;
int height = pictureBox1.Image.Height;
int width = pictureBox1.Image.Width;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
c = bitImage.GetPixel(j,i);
int r = c.R;
int g = c.G;
int b = c.B;
if ((r + g + b) / 3 >= 127)
{
bitImage.SetPixel(j, i, Color.FromArgb(255, 255, 255));
}
else
{
bitImage.SetPixel(j, i, Color.FromArgb(0,0,0));
}
}
}
return bitImage;
}ascript
04
**膨脹算法**
膨脹是將與物體接觸的全部背景點合并到該物體中,使邊界向外部擴張的過程。
能夠用來填補物體中的空洞。
用3x3的結構元素,掃描圖像的每個像素
用結構元素與其覆蓋的二值圖像做“或”操作
假設都為0,結果圖像的該像素為0。否則為1
結果:使二值圖像擴大一圈
膨脹(dilation)能夠看做是腐蝕的對偶運算,其定義是:把結構元素B平移a后得到Ba,若Ba擊中X,我們記下這個a點。全部滿足上述條件的a點組成的集合稱做X被B膨脹的結果。用公式表示為:D(X)={a | Ba↑X}=X腐蝕,膨脹,細化算法B,例如以下圖所看到的。圖中X是被處理的對象,B是結構元素,不難知道,對于隨意一個在陰影部分的點a,Ba擊中X,所以X被B膨脹的結果就是那個陰影部分。陰影部分包含X的全部范圍,就象X膨脹了一圈似的,這就是為什么叫膨脹的原因
![圖片](//file.elecfans.com/web2/M00/8F/3F/poYBAGPjXwWAYVTXAAGdzZEFSiQ676.jpg)
在下圖中,左邊是被處理的圖象X(二值圖象,我們針對的是黑點),中間是結構元素B。膨脹的方法是,拿B的中心點和X上的點及X周圍的點一個一個地對,假設B上有一個點落在X的范圍內,則該點就為黑;右邊是膨脹后的結果。能夠看出,它包含X的全部范圍,就象X膨脹了一圈似的。
![圖片](//file.elecfans.com/web2/M00/8F/C3/pYYBAGPjXwSAY1KwAAOC21wRXiM686.jpg)
我設計了一個簡單的膨脹算法,依次遍歷整個圖片的像素,分析每個像素的周圍八個像素,僅僅要該像素周圍存在黑色的像素,就設置該像素顏色為黑色。以下是使用膨脹算法處理經過二值化后的圖像的實現代碼:
public bool[] getRoundPixel(Bitmap bitmap, int x, int y)//返回(x,y)周圍像素的情況,為黑色,則設置為true
{
bool[] pixels=new bool[8];
Color c;
int num = 0;
for (int i = -1; i < 2; i++)
{
for (int j = -1; j < 2; j++)
{
c = bitmap.GetPixel(x+i,y+j);
if (i != 0 || j != 0)
{
if (255 == c.G)//由于經過了二值化,所以僅僅要檢查RGB中一個屬性的值
{
pixels[num] = false;//為白色,設置為false
num++;
}
else if(0==c.G)
{
pixels[num] = true;//為黑色,設置為true
num++;
}
}
}
}
return pixels;
}
public Bitmap expend()
{
Bitmap bitImage = new Bitmap(pictureBox2.Image);//處理pictureBox2中的圖片
Bitmap bitImage1 = new Bitmap(pictureBox2.Image);
int height = pictureBox1.Image.Height;
int width = pictureBox1.Image.Width;
bool[] pixels;
for (int i = 1; i < width-1; i++)
{
for (int j = 1; j < height-1; j++)
{
if (bitImage.GetPixel(i, j).R != 0)
{
pixels = getRoundPixel(bitImage, i, j);
for (int k = 0; k < pixels.Length; k++)
{
if (pixels[k] == true)
{
//set this piexl's color to black
bitImage1.SetPixel(i, j, Color.FromArgb(0,0,0));
break;
}
}
}
}
}
return bitImage1;
}
看看最終執行的效果圖如下:
![圖片](//file.elecfans.com/web2/M00/8F/3F/poYBAGPjXwSABNzVAAAFQ6yAYyI591.jpg)
-
圖像處理
+關注
關注
27文章
1306瀏覽量
56933 -
RGB
+關注
關注
4文章
801瀏覽量
58758
發布評論請先 登錄
相關推薦
圖像算法有什么神奇之處
請問改進的Ferret算法和目前常用的測量算法有哪些不同?
圖像處理算法有哪些_圖像處理十大經典算法
有趣的圖像處理算法
最基礎的圖像處理常用算法
![最基礎的<b class='flag-5'>圖像</b><b class='flag-5'>處理</b><b class='flag-5'>常用</b><b class='flag-5'>算法</b>](https://file.elecfans.com/web1/M00/90/3A/o4YBAFzFYliAZYSoAAAIXYPggIY533.jpg)
圖像處理常用算法(基礎)
![<b class='flag-5'>圖像</b><b class='flag-5'>處理</b><b class='flag-5'>常用</b><b class='flag-5'>算法</b>(基礎)](https://file.elecfans.com/web1/M00/90/C8/o4YBAFzH-HyAUpIoAAAIXYPggIY183.jpg)
機器視覺工業缺陷檢測常用的圖像處理算法
圖像處理與機器視覺
FPGA圖像處理算法有哪些
![FPGA<b class='flag-5'>圖像</b><b class='flag-5'>處理算法</b><b class='flag-5'>有</b>哪些](https://file1.elecfans.com/web2/M00/A2/91/wKgZomT_xhGAfuONAAFv1ShpxzU164.png)
FPGA上的圖像處理算法集成與優化
![FPGA<b class='flag-5'>上</b>的<b class='flag-5'>圖像</b><b class='flag-5'>處理算法</b>集成與優化](https://file1.elecfans.com/web3/M00/08/44/wKgZPGeu2TqALkQXAAAbnJBI8_A972.png)
評論