討論區快速選單
知識庫快速選單
政府補助!學嵌入式+物聯網 掌握Salesforce雲端管理秘訣
[ 回上頁 ] [ 討論區發言規則 ]
如何用程式語言實作影像處理的去背景 ?
更改我的閱讀文章字型大小
作者 : renowu(阿文)
[ 貼文 2 | 人氣 7636 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/13 下午 08:36:29
各位大大你好...小弟有問題要請教..就是現在有一張大頭貼圖片.需要用VB把不要的背景去掉..只留下臉的部位..應為我做的人臉辨識系統...老師有跟我說利用膚色比對.用RGB轉YCrCb然後在判斷膚色所佔的區域值..不是膚色的區域就去除...就會留下人臉了...<我問過很多人利用VB好像不行..後來我想說用C++來寫然後再去連結VB就可以了...或是其他方法只要到時候VB可以連結他就好了..... <我有看過一篇論文它適用C++寫的...>不過我還是想不出來...希望大家能幫幫我解決這個問題..感激不盡..謝謝..

作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/13 下午 10:50:46
程式語言是一回事, 演算法是一回事, 有演算法再來考慮用什麼程式語言吧. 關於去背景的影像處理, 我是沒經驗過, 因沒有人回覆到比較有效的方法, 因此才提供一些個人的建議, 只是可行不可行, 我無法打包票...

我的想法是:

1. 先對影像做對比強化後, 再做邊緣銳化處理, 區分出整個影像的封閉區域有那些.
2. 針對每個封閉區域 , 計算其平均色彩. (區域面積過小的可略過)
3. 找出平均色彩最接近膚色的區域, 便是人臉. 將其餘封閉區域全數去除.

需要寫程式去驗證一下是否可行, 這點我無法代勞.

其實你也可以去網路上, 或是圖書館, 找看看有否類似的論文, 也許都已有不錯的演算法也不一定. 那就不用再這麼辛苦地實驗了...
作者 : linkin(Linkin) 影像處理與計算機圖學優秀好手C++ Builder優秀好手貼文超過500則
[ 貼文 696 | 人氣 1493 | 評價 3450 | 評價/貼文 4.96 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/10/13 下午 11:52:09

>
>1. 先對影像做對比強化後, 再做邊緣銳化處理, 區分出整個影像的封閉區域有那些.
>2. 針對每個封閉區域 , 計算其平均色彩. (區域面積過小的可略過)
>3. 找出平均色彩最接近膚色的區域, 便是人臉. 將其餘封閉區域全數去除.

呼 黑人 黃人 白人 亂七九糟人 等人種的膚色ㄌㄟ
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/11/3 下午 03:13:20
同類形的功課我也做過一個, 也是用 VB 來做. 讀取圖檔, 跟 VB 或 是C++ 沒關係, 反正就是讀取檔案. 用 VB 做一樣可以.

另一個問題, 就是分類的問題, 這個學問可大了. 最簡單的做, 就是先定一個人臉顏色, 然後設一個特定的 threshold, threshold 內的, 就當作是屬於人臉 pixel. 但是, 這個做法的缺陷是很明顯的, 人臉的顏色不是統一的, threshold 內的 pixel 又不一定是人臉的. 那時候的功課, 我把比對的 pixel 擴大到 4x4, 然後在 MSE 設一個 threshold, 而 人臉代表的 4x4 pixel 是由人手在畫面上選取的, 效果比較好. 但是大學時代學識有限, 只做這裡而已. 做分類其實有很多更好的演算法, 比方說 k-mean cluster, neural network ... ...

努力吧...
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2189 | 人氣 89850 | 評價 10120 | 評價/貼文 4.62 | 送出評價 79 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/11/3 下午 03:31:54
順帶一提, 就算只是 24bit color 圖檔, 所表達的的顏色實在遠遠比 24bit 要多. 舉例說, 24bit color 圖檔, 我們可以看出 金色, 但是, 實際上, 所有 24bit color 中並不存在一個金色的值, 這個金色, 是由一個小區域內的不同顏色組合得來的, 試試找一張有金色的照片, 放大到能看到每一 pixel, 你就可以看到實際上是什麼的情況.

在早期的顯示卡色彩只有 256 個的年代, 會利用這個技巧來模擬比 256 個要多的顏色, 這就是所謂的 dithering.

做分類, 要把這個情況也算進去才行的.
作者 : jackon(風)
[ 貼文 83 | 人氣 4338 | 評價 190 | 評價/貼文 2.29 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/11/4 上午 06:43:41
其實可以把color image轉換成gray image阿~
這樣會比較好處理...
作者 : archimage(archimage)
[ 貼文 85 | 人氣 5 | 評價 1280 | 評價/貼文 15.06 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/11/4 下午 03:25:58
我只懂影像處理的皮毛,而且沒有做過這部份的題目~~不過我也說說我的想法不知可行嗎?
- 將影像轉成YCbCr或其它的你認為較佳的color space.
- 使用color segmentation 的方式,將相似的色塊region growing成為不同的
object。並使用那些資訊判斷是否為人的臉(用color或shape等資訊)。如果要求速
度的話;region growing的方式可能就會久一點...
- 用NN的方式去學某種人它的顏色或其它相關feature來辨識;或用non-supervise直接做
K-Mean之類的clustering..
- 可配合上面兩個方式,先學習膚色再使用segmentation去處理自己有興趣的顏色(速度應該會快一點吧~不知>.< )
- 之前也有看到有人直接轉成gray level加上segmentation的方式去找橢圓形的shape來
當作是臉(不知黑人在深色背景抓得到嗎?呵~~反正環境參數是你控制的~~)
- 將上面的方式全部加在一起...嘿嘿~~
作者 : channing(Dragon)
[ 貼文 51 | 人氣 3363 | 評價 50 | 評價/貼文 0.98 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/11/16 下午 09:22:15
這邊也提供一個方法<影像分割>
一般又稱為顆粒搜尋,以8鄰接點或是4鄰接點為基礎,由左而右,在由上而下未編碼的
點,在以該點出發向鄰近各點去尋找相同亮度的點素,將搜尋到的連結在一起並且重新
編列一個新碼,帶確定所有連結再一起相同亮度的點素都已經轉換成同一碼值以後,在
向下一目標時實施掃描處理,最後確定所有點素皆已經編碼以後,影像分割過程即完成
此以方法可以計算影像的
1.面積 (所有點總數 x 單一點所代表的面積 = 實際面積)
2.邊長 (經過拉氏轉換(書上有很多資料)以後可得到影像的邊緣)
3.中心點(X,Y) X= 1/N EX Y= 1/N EY (E代表所有的)
4.最大半徑 (物體中心點到邊緣的最長距離)
5.最小半徑 (物體中心點到邊緣的最短距離)
6.以及取出相同顏色或是接近顏色畫素
人臉來說,膚色與眼睛的顏色不同,膚色容易取出,但眼睛的顏色並非全然相同顏色,在取
畫素的時候必須考慮黑眼球與白眼球部分(因為黑RGB=0,0,0 白RGB=255,255,255)
有可能黑眼球太小被判定為雜訊
作者 : greco(none)
[ 貼文 20 | 人氣 5 | 評價 220 | 評價/貼文 11 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2004/11/19 上午 11:24:58
你若只要做大頭照的話 去搜尋head tracking 相關paper
一般而言做法如下
1. 用normalized R,G 找出膚色點
2. 先Erosion 再Dilation 把雜點去掉
3. 用Connected component labeling 把膚色點連成一個region
4. 判斷那些膚色區域為人臉,這一步做法就很多。比如說長寬比,或是看看膚色region是否為凸形,或是找出長軸來,或是在膚色區域上找雙眼與嘴唇。你可以參考許瑞麟的 face detection in color image, IEEE Trans. PAMI 2002
http://www.cse.msu.edu/~hsureinl/facloc/index_facloc.html

另外,若你想做精確的face detection的話,最近這幾年這個技術很成熟了,你若有興趣,可以依照底下的paper 順序的讀過,就會對這個領域有概念了,我只列出作者,即可依此找到paper
K.K Sung & Poggio, MIT, PAMI
Rowley & Kanade, CMU, PAMI
Viola & Jones, IJCV

這三篇都很有價值。kk sung and poggio做出apperance based face detection,第一個能達到high detection rate。rowley的架構很簡單,單純的MLP而已,但是connection不太一樣,應該很容易implement。viola 則是第一個做到real time frontal face detection的人。
最近這兩年,有人做出了 real time , multi-pose face detection。我印象中讀過三篇,都是base on viola 的方法。

對了,附帶一提,你也可以直接參考 M H Yang 的 face detection : A Survey, IEEE Trans. PAMI.
作者 : chchen(小陳)
[ 貼文 1 | 人氣 5 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/1/12 下午 01:42:40
我講一下我的經驗,如果是單純背景的話而且只有人臉,例:大頭照。
如果不做膚色偵測的話,還是有辦法取出膚色的部份,做法如下:
1. 先將所有的pixel以YCbCr的方式轉換,只留下Y的部份
2. 將Y的部份顯示出來
3. 調整Y值,直到找到一個threashold可以讓整個人臉顯示出來,此時整張照片得到的就只有膚色部份

     這個方法只適用於光度比較平均的影像,因為人的膚色在受到光的照射會反射與周邊不同的強度,使用這個方法可以簡單的取出人臉的部份

如果您有用Matlab的話可以試試以下的程式碼:

% 讀取影像檔
img = imread('大頭照.jpg');
% RGB轉YCbCr
imycc = rgb2ycbcr(img);
% 顯示YCbCr影像(原影像)
imshow(imycc);
% 將Y, Cb, Cr各別取出
y = imycc(:,:,1);
cb = imycc(:,:,2);
cr = imycc(:,:,3);
figure(1);
% 顯示y部份影像
imshow(y);
% 設定影像大小
imag_row = size(img,1);
imag_col = size(img,2);
binImage = zeros(imag_row,imag_col);
Y = zeros(imag_row,imag_col);
% T值,如果介於區間內的值則標示為1
Y(find((y(:,:,1) > 150) & (y(:,:,1) < 240)))=1;
% 以Threashold過濾後的影像
figure(2);
imshow(Y);
作者 : linkin(Linkin) 影像處理與計算機圖學優秀好手C++ Builder優秀好手貼文超過500則
[ 貼文 696 | 人氣 1493 | 評價 3450 | 評價/貼文 4.96 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2006/1/12 下午 09:10:38
原提問者問到 將影像去被

由於不是用在即時追蹤上 因此可用下列的方式

http://grail.cs.washington.edu/projects/digital-matting/image-matting/

以上...
作者 : rlone(omost)
[ 貼文 5 | 人氣 245 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/10/25 下午 09:28:09
1.先找出臉框位置-可先利用OpenCV 找臉
2.在限定範圍內找眼睛位置也可以用OpenCV
3.如此再推估可能的ROI......

作者 : greenbike(綠色最自然)
[ 貼文 21 | 人氣 1 | 評價 170 | 評價/貼文 8.1 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/1/7 下午 02:19:00
opencv是可以找出人臉
但學習障礙有
1.如何使用opencv函式庫連接攝影機
2.如何看懂opencv函式的意義
3.找到人臉之後,如何將人臉取出
4.若利用人臉辨識的資料庫訓練,那就違背自己的論文
5.如何自己修改opencv的函式,達到我們要的效率(太多參數,與演算法)

所以初學不建議opencv
知道影像辨識的相關原理之後再去套用這免費的函式庫比較好
若是有自己的論文要研究,只能取用部分opencv函式庫幫你
例如sobel或是canny幫你取得臉部外輪廓

而膚色在論文上以YCbCr的方式比較準確
台灣碩博士研究論文有一堆,自己找一下就好
重點是你的論文到底是人臉辨識?還是去背景
大頭照去背景是個不容易的東西,除非你背景已經事先取得,而且是在動態取得(就是每幾秒就取一次)
如果是實驗時才取背景一次,就要保證背景不要有人干擾光線,否則去背景運算會誤判。
要完整的人像(包含頭髮衣服)出現要花工夫

如果只是人臉辨識
那就是特徵比較重要,而人臉位置,有分固定(門禁掃描)跟不固定的(防盜與有人入侵)
固定的就簡單了,基本的眼睛與鼻子可能用Haar就找到了
不固定的就難了,先判斷是人、還有臉的出現、側面臉問題、帽子與口罩問題
找到人臉後,辨識要靠資料庫比對
但之後的資料庫訓練要自己搞了...




作者 : deyu1978(悠悠深藍)
[ 貼文 11 | 人氣 5 | 評價 220 | 評價/貼文 20 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/6/24 上午 08:06:00
這跟使用的語言毫無相關,VB的WebCamera膚色偵測原始碼及執行檔在『數位影像處理技術手冊、文魁』一書就有附了。要VC的膚色偵測在『數位影像分析之智慧型監視系統、文魁』一書裡面也有原始碼及執行檔。所以跟語言毫無相關。
膚色在學術上還沒有真正能夠定義,有誰能夠說這個顏色就代表膚色,所以都是利用統計的方式來決定。
你自己也可以統計一遍,計算出自己的膚色範圍。
作者 : aiwioi(555)
[ 貼文 2 | 人氣 1 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/7/7 上午 02:09:04
請問一下 做正規化時 我的R+G+B 為什麼會為0 ??
// for each pixel
     for (int x = 0; x < width; x++, src += 3, dst += 3)
     {
     //rgb normalization
     if ((src[2] + src[1] + src[0]) == 0)
     {
     r[x, y] = (double)(0);
     g[x, y] = (double)(0);
     }

     else
     {

     r[x, y] = (double)(src[2] / (src[2] + src[1] + src[0]));
     g[x, y] = (double)(src[1] / (src[2] + src[1] + src[0]));

     W[x, y] = (double)((r[x, y] - 0.33) * (r[x, y] - 0.33) + (g[x, y] - 0.33) * (g[x, y] - 0.33));
     Qup[x, y] = (double)(-1.3767 * r[x, y] * r[x, y] + 1.0743 * r[x, y] + 0.25);
     Qdown[x, y] = (double)(-0.776 * r[x, y] * r[x, y] + 0.5601 * r[x, y] + 0.18);

     if ((g[x, y] < Qup[x, y]) && (g[x, y] > Qdown[x, y]) && (W[x, y] > 0.001) && ((src[2] - src[1]) >= 15))
     {
     dst[2] = 255;
     dst[1] = 255;
     dst[0] = 255;
     }
     else
     {
     dst[0] = 0;
     dst[1] = 0;
     dst[2] = 0;
     }
     }
作者 : claretphoenix(小綾)
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/7/7 上午 03:36:49
> 我的R+G+B 為什麼會為0 ?
你用的是什麼語言呢?(很像 Matlab 混 C...)
 板主 : 徵求中
 > 影像處理與計算機圖學 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 影像處理與計算機圖學 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
影像處理與計算機圖學
1 Linkin 780 
2 CrazyStar 400 
3 青衫 360 
4 白老鼠(Gary) 330 
5 悠悠深藍 220 
6 none 220 
7 shou 200 
8 ultra 200 
9 ghost 140 
10 ozzy 130 
影像處理與計算機圖學
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.140625