使用Python进行对象检测和分割

时间:2016-08-15 14:11:20

标签: python opencv image-processing ocr image-segmentation

我是一名本科生。我是图像处理和python的新手。

我有许多植物样本及其描述的图像(称为贴在样本上的标签),如下图所示。我需要自动分割样本中的那些标签。

我尝试了基于颜色的阈值处理,但它失败了。能否请你举个例子来做这个任务。我需要一些想法或代码才能使其完全自动分割。

如果您是图像处理和Python的专家,请帮助我,我需要您的帮助才能完成此任务。

在左上角检测到矩形,但它应位于右下角。你能告诉我我的错误在哪里以及如何纠正它。 我还给出了以下代码。

2 个答案:

答案 0 :(得分:0)

您可以尝试与大白色矩形匹配的模板,以识别存储信息的区域。

http://docs.opencv.org/3.1.0/d4/dc6/tutorial_py_template_matching.html#gsc.tab=0

当它完成后,你将能够识别这个区域中的角色...你保存一个小的子图像,并使用像pytesseract这样的工具,你将能够读取字符。

https://pypi.python.org/pypi/pytesseract

这里有其他OCR,有一些例子: https://saxenarajat99.wordpress.com/2014/10/04/optical-character-recognition-in-python/

祝你好运!

答案 1 :(得分:0)

为什么要使用颜色阈值?我用ImageJ尝试了这个并获得了不错的结果。我刚刚使用固定阈值(在这种情况下为166)将图像转换为8位和binarise。您可以从图片histogram中选择最佳阈值。 然后,您只需找到您的白色矩形区域,并阅读建议的FrsECM等字符。

这是c ++中的一个例子:

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/// Global variables
int threshold_nvalue = 166; 
const int thresh_increment = 2;
int threshold_type = THRESH_BINARY;//1
int const max_value = 255;
int const morph_size = 3;
int const  min_blob_size = 1000;
Mat src, src_resized, src_gray, src_thresh, src_morph;

/**
* @function main
*/
int main(int argc, char** argv)
{
    /// Load an image
    src = imread("C:\\Users\\phili\\Pictures\\blatt.jpg", 1);
    //Resize for displaying it properly
    resize(src, src_resized, Size(600, 968));
    /// Convert the image to Gray
    cvtColor(src_resized, src_gray, COLOR_RGB2GRAY);    
    /// Region of interest
    Rect label_rect;
    //Binarization sing fixed threshold
    threshold(src_gray,src_thresh, thres, max_value, threshold_type);
    //Erase small object using morphologie
    Mat element = getStructuringElement(0, Size(2 * morph_size + 1, 2 * morph_size + 1), Point(morph_size, morph_size));
    morphologyEx(src_thresh, src_morph, MORPH_CLOSE, element);  

    //find white objects and their contours
    std::vector<std::vector<Point> > contours;
    std::vector<Vec4i> hierarchy;
    findContours(src_morph, contours, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, Point(0, 0));
    for (std::vector<std::vector<Point> >::iterator it = contours.begin(); it != contours.end(); ++it)
    {

        //just big blobs
        if (it->size()>min_blob_size)
        {
            //approx contour and check for rectangle
            std::vector<Point> approx;
            approxPolyDP(*it, approx, 0.01*arcLength(*it, true), true);
            if (approx.size() == 4)
            {
                //just for visualization 
                drawContours(src_resized, approx, 0, Scalar(0, 255, 255),-1);
                //bounding rect for ROI
                label_rect = boundingRect(approx);
                //exit loop             
                break;
            }
        }


    }
    //Region of interest
    Mat label_roi = src_resized(label_rect);

    //OCR comes here...
}