c - 如何从图像的直方图中过滤感兴趣的对象?

标签 c image-processing opencv histogram

场景是这样的,我有一张图像,我只想从中提取文本以进行进一步的 OCR 处理,我试图通过腐 eclipse 和膨胀来删除 Logo ,但是当卡片的背景中有图像或卡片分为 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 );
}

最佳答案

生成直方图很简单,OpenCV 文档中提供了代码。所以你并没有真正给我们任何有用的东西。剩下的任务才是真正的挑战所在。我很乐意看到您尝试处理该问题。

我从你的其他问题中注意到你对这个问题很感兴趣。我需要说的是,解决它可能比你之前想象的要复杂一些。您可能希望稍微限制您尝试解决的问题的范围,因为为所有类型的名片开发通用检测系统将很困难!

我做了一些研究,我将与您分享我发现的一些有趣的 Material :

关于c - 如何从图像的直方图中过滤感兴趣的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10302491/

相关文章:

python - skimage 模块缺乏记录的功能

python - 生成小于 10KB 且不丢失比例的图像缩略图

java - 如何在 Raspberry PI(armv6 和 armv7 Raspian)上使用 Java 中的 OpenCV 4?

c++ - 在 Windows 上编译 MariaDB C/C++ 连接器

c - 在 c 中使用带有命令行参数的 if 语句

python - 使用 src/target 坐标使用 Python PIL 进行透视变换

windows - 在opencv中,有没有一种方法可以打开正在实时记录和创建的.avi?

c - 获得 Windows 控件首选大小的正确方法

c++ - [][] 的含义是否特定于上下文?

OpenCV:移动单相机的旋转矩阵和平移向量