2012-01-26 16 views
3

最初の画像で赤い領域の位置を見つけて、それをグレースケール画像で同じ位置にマークする方法は?MATLABを使用してイメージ内の赤い領域の位置を見つける方法は?

Colored Image

Marked Image

+0

まあ、私は灰色の画像、最初の画像に示されているようなカラー画像ではない勾配の結果を取得します。私はそれがイメージの照明レベルの単なる色表現だと思う。その場合、イメージングの高い領域を分離するのに適した値にイメージのしきい値を設定する必要があります。私はその答えを編集しました。 –

+0

@Kimちょっと好奇心:最初の画像はどのように生成されたのですか? –

答えて

28

希望これは私が最初に画像処理上のいくつかの良いと基本的な本を読むことをお勧めしたいと思いますthis question.

の続きです。私はこの本をお勧めします:Digital image processing using MATLAB by Gonzalez

1)R、G、B面に画像を変換する:とにかく、あなたの質問について

Image_red = Image_rgb(:,1); 
Image_green = Image_rgb(:,2); 
Image_blue = Image_rgb(:,3); 

2)必要な領域)があなたの質問に画像の通りの(赤色の高い含有量を有​​しているので、適切な値をR面としきい値を取ります。

BW = im2bw(Image_red, threshold value) 

3)バーコード領域が1色(白色と仮定する)であり、他の部分が異なる色(黒色)である2値画像が得られます。

4)この白い領域の位置を最小境界矩形として取得します。

STATS = regionprops(BW, 'BoundingBox') 

この矩形の位置を取得したら、好きなことをしてください。例えば、作物、バーコード認識のためのimcropコマンドを使用して、元の画像から、この長方形のバーコードを隔離する:

barcode = imcrop(original_image, rect) 

を(私はコードが完全ではありません知っている私は、ので、私が使用するコマンドの唯一のヒントを与えました。 matlabに慣れておらず、画像処理にopencvを使用していますが、確かに簡単な作業でコードを完成させることができます。

EDIT:

iは導出式を実装し、ローパスフィルタリングを適用した後、私が得た画像がグレースケールです。私はちょうどしきい値を適用して、高照度(バーコード領域を含む)の領域だけを取得し、他のすべての部分を遮光するようにしました。簡単なノイズや小さな誤検出を除去するために何らかの侵食を適用してください。補償のために膨張を適用する。今では、最大面積(おそらく、バーコード)で輪郭を見つけることができます。可能な限り小さな四角形を取得します。あなたのバーコードです。 (私はOpenCV Pythonで実装しましたが、Matlabでそれを行う方法はわかりません)。以下にいくつかのテスト結果です:

以下

Image 1 Image 2

は、OpenCVのコードです:

#### Code for BARCODE detection ###### 
import cv,sys 
imgco = cv.LoadImage('image.jpg') 
img = cv.CreateImage(cv.GetSize(imgco),8,1) 
imgx = cv.CreateImage(cv.GetSize(img),cv.IPL_DEPTH_16S,1) 
imgy = cv.CreateImage(cv.GetSize(img),cv.IPL_DEPTH_16S,1) 
thresh = cv.CreateImage(cv.GetSize(img),8,1) 

### Convert image to grayscale ### 
cv.CvtColor(imgco,img,cv.CV_BGR2GRAY) 

### Finding horizontal and vertical gradient ### 

cv.Sobel(img,imgx,1,0,3) 
cv.Abs(imgx,imgx) 

cv.Sobel(img,imgy,0,1,3) 
cv.Abs(imgy,imgy) 

cv.Sub(imgx,imgy,imgx) 
cv.ConvertScale(imgx,img) 

### Low pass filtering ### 
cv.Smooth(img,img,cv.CV_GAUSSIAN,7,7,0) 

### Applying Threshold ### 
cv.Threshold(img,thresh,100,255,cv.CV_THRESH_BINARY) 

cv.Erode(thresh,thresh,None,2) 
cv.Dilate(thresh,thresh,None,5) 

### Contour finding with max. area ### 
storage = cv.CreateMemStorage(0) 
contour = cv.FindContours(thresh, storage, cv.CV_RETR_CCOMP, cv.CV_CHAIN_APPROX_SIMPLE) 
area = 0 
while contour: 
    max_area = cv.ContourArea(contour) 
    if max_area>area: 
     area = max_area 
     bar = list(contour) 
    contour=contour.h_next() 

### Draw bounding rectangles ### 
bound_rect = cv.BoundingRect(bar) 
pt1 = (bound_rect[0], bound_rect[1]) 
pt2 = (bound_rect[0] + bound_rect[2], bound_rect[1] + bound_rect[3]) 
cv.Rectangle(imgco, pt1, pt2, cv.CV_RGB(0,255,255), 2) 

cv.ShowImage('img',imgco)  
cv.WaitKey(0) 

このコードを試してみてください。コードを理解したら、matlabに変換してみてください。あなたは見ることができますOpenCV documentation here.

+0

このコーディングを続けるにはどうすればよいですか? 私のコーディングの最後の部分はこれです... figure()、ColourBar = imagesc(C);カラーバー。 – Kim

+0

このコードの出力はあなたの質問の最初のイメージと同じですか?私は、バーコードの場所に高い赤色を意味するのですか? –

+0

うん!!コーディングはここからです[リンク](http://stackoverflow.com/questions/9005746/applying-the-formula-to-determine-the-barcode-matlab) – Kim

関連する問題