2012-04-24 50 views
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

生成柱狀圖是容易的部分,並有可用的代碼的OpenCV的文檔。所以你並沒有給我們任何有用的東西。其餘的任務是真正的挑戰。我很樂意看到你的嘗試。

我注意到你的其他問題,你對這個問題很感興趣。我需要說,解決這個問題可能比你預想的要複雜一點。您可能想要限制您試圖解決的問題的範圍,因爲開發適用於所有類型名片的通用檢測系統將非常困難!

我做了一些研究,我會與大家分享一些有趣的材料,我發現:

+1

這是真棒,在一個頁面中的所有武器。一個大+1這一點。 – 2012-04-25 14:48:10

相關問題