我正在用OpenCV为Android写作.我正在使用标记控制的分水岭分割类似于下面的图像,而无需用户手动标记图像.我打算使用区域最大值作为标记.
minMaxLoc()会给我价值,但我怎么能把它限制在我感兴趣的blob?我可以利用findContours()cvBlob blob 的结果来限制ROI并对每个blob应用最大值吗?

opencv image-processing computer-vision image-segmentation watershed
在EmguCV中应用于图像进行文本识别的最佳图像预处理操作是什么?
我在这里包含了两个样本图像.
应用低通或高通滤波器将不合适,因为文本可以是任何尺寸.我尝试了中位数和双边滤波器,但它们似乎并没有太大影响图像.
理想的结果是二进制图像,所有文本都是白色的,其余大部分是黑色的.然后将该图像发送到OCR引擎.
谢谢
您好我正在使用OpenCV库编写基本的C++应用程序,以从背景中分割图像的主题.应用程序读入图像文件并使用分水岭算法根据在边缘找到的数据和在图像中心找到的数据生成掩码.
(为了开始我创建了一个整体值为-1的图像对象.然后我在一个空图像周围创建了一个边界,其值为1.然后我创建了一个大致位于图像中心的矩形,其值为2.边框和矩形没有接触.)
我尝试使用生成的掩码从原始图像和自动生成的掩码之间使用按位AND删除图像中的数据.
我用C++编写了这个,如果有人可以快速查看我的代码,我将非常感激.我能找到的唯一类似示例是使用Python的原生OpenCV绑定.
样品面膜:http://i.imgur.com/a0SUwy3.png
示例图片:http://i.imgur.com/FQywu6P.png
// Usage: ./app input.jpg
#include "opencv2/opencv.hpp"
#include <string>
using namespace cv;
using namespace std;
class WatershedSegmenter{
private:
cv::Mat markers;
public:
void setMarkers(cv::Mat& markerImage)
{
markerImage.convertTo(markers, CV_32S);
}
cv::Mat process(cv::Mat &image)
{
cv::watershed(image, markers);
markers.convertTo(markers,CV_8U);
return markers;
}
};
int main(int argc, char* argv[])
{
cv::Mat image = cv::imread(argv[1]);
cv::Mat blank(image.size(),CV_8U,cv::Scalar(0xFF));
cv::Mat dest(image.size(),CV_8U,cv::Scalar(0xFF));
imshow("originalimage", image);
// Create markers image
cv::Mat markers(image.size(),CV_8U,cv::Scalar(-1));
//Rect(topleftcornerX, topleftcornerY, width, height);
//top rectangle
markers(Rect(0,0,image.cols, 5)) …Run Code Online (Sandbox Code Playgroud)