0

シナリオは次のようになります。さらに OCR 処理を行うためにテキストのみを抽出したい画像があります。侵食と膨張によってロゴを削除しようとしましたが、カードの背景に画像がある場合、またはカードが2つの異なる色に分割されるので、カードのヒストグラムを計算してから、背景またはその他の非テキスト領域のピークが最小になるようにテキストをフィルタリングすると思います。このopencvコードを取得して、画像のヒストグラムを計算します

OpenCV コード:

IplImage* trueColorImage = cvLoadImage("plastics.jpg");
TrueColorIplImg=[self CreateIplImageFromUIImage:trueColorImage];
IplImage* channel = cvCreateImage( cvGetSize(TrueColorIplImg), 8, 1);
IplImage *hist_img = cvCreateImage(cvSize(300,240), 8, 1);
cvSet( hist_img, cvScalarAll(255), 0 );
CvHistogram *hist_red;
CvHistogram *hist_green;
CvHistogram *hist_blue;
int hist_size = 256;      
float range[]={0,256};
float* ranges[] = { range };
float max_value = 0.0;
float max = 0.0;
float w_scale = 0.0;
hist_red = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
hist_green = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
hist_blue = cvCreateHist(1, &hist_size, CV_HIST_ARRAY, ranges, 1);
cvSetImageCOI(TrueColorIplImg,3);
cvCopy(TrueColorIplImg,channel);
cvResetImageROI(TrueColorIplImg);
cvCalcHist( &channel, hist_red, 0, NULL );
cvSetImageCOI(TrueColorIplImg,2);
cvCopy(TrueColorIplImg,channel);
cvResetImageROI(TrueColorIplImg);
cvCalcHist( &channel, hist_green, 0, NULL );
cvSetImageCOI(TrueColorIplImg,1);
cvCopy(TrueColorIplImg,channel);
cvResetImageROI(TrueColorIplImg);
cvCalcHist( &channel, hist_blue, 0, NULL );
cvGetMinMaxHistValue( hist_red, 0, &max_value, 0, 0 );
cvGetMinMaxHistValue( hist_green, 0, &max, 0, 0 );
max_value = (max > max_value) ? max : max_value;
cvGetMinMaxHistValue( hist_blue, 0, &max, 0, 0 );
max_value = (max > max_value) ? max : max_value;    
cvScale( hist_red->bins, hist_red->bins, ((float)hist_img->height)/max_value, 0 );
cvScale( hist_green->bins, hist_green->bins, ((float)hist_img->height)/max_value, 0 );
cvScale( hist_blue->bins, hist_blue->bins, ((float)hist_img->height)/max_value, 0 );
printf("Scale: %4.2f pixels per 100 units\n", max_value*100/((float)hist_img->height));                         
w_scale = ((float)hist_img->width)/hist_size;
 for( int i = 0; i < hist_size; i++ )
{
    cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->height),
                cvPoint((int)(i+1)*w_scale, hist_img->height - cvRound(cvGetReal1D(hist_red->bins,i))),
                CV_RGB(255,0,0), -1, 8, 0 );
    cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->height),
                cvPoint((int)(i+1)*w_scale, hist_img->height - cvRound(cvGetReal1D(hist_green->bins,i))),
                CV_RGB(0,255,0), -1, 8, 0 );
    cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->height),
                cvPoint((int)(i+1)*w_scale, hist_img->height - cvRound(cvGetReal1D(hist_blue->bins,i))),
                CV_RGB(0,0,255), -1, 8, 0 );
}
4

1 に答える 1

4

ヒストグラムの生成は簡単な部分であり、OpenCVのドキュメントで利用可能なコードがあります。ですから、あなたは本当に私たちに役立つものを何も与えていません。残りのタスクは、真の課題です。私はあなたがそれに対処する試みを見てみたいです。

他の質問から、あなたがこの問題に非常に興味を持っていることに気づきました。それを解決することは、あなたが以前に想像していたよりも少し複雑かもしれないと言う必要があります。すべての種類の名刺用の汎用検出システムの開発は困難になるため、解決しようとしていることの範囲を少し制限することをお勧めします。

私はいくつかの調査を行い、私が見つけた興味深い資料のいくつかをあなたと共有するつもりです:

于 2012-04-24T17:37:23.883 に答える