基于Python的目标检测与分割

基于Python的目标检测与分割,python,opencv,image-processing,ocr,image-segmentation,Python,Opencv,Image Processing,Ocr,Image Segmentation,我是一名本科生。我不熟悉图像处理和python 我有很多植物样本的图像和它们的描述(称为标签,粘贴在样本上),如下图所示。我需要从样本中自动分割这些标签 我尝试了基于颜色的阈值,但失败了。你能给我举个例子来做这个任务吗。我需要一些想法或代码,使它完全自动分割 如果你是图像处理和Python方面的专家,请帮助我,我需要你的帮助来完成这项任务 在左上角检测到矩形,但它应该在右下角。你能告诉我我的错误在哪里以及如何改正吗。 我还提供了下面的代码。您可以尝试使用与白色大矩形匹配的模板来标识存储信息的区域

我是一名本科生。我不熟悉图像处理和python

我有很多植物样本的图像和它们的描述(称为标签,粘贴在样本上),如下图所示。我需要从样本中自动分割这些标签

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

如果你是图像处理和Python方面的专家,请帮助我,我需要你的帮助来完成这项任务

在左上角检测到矩形,但它应该在右下角。你能告诉我我的错误在哪里以及如何改正吗。
我还提供了下面的代码。

您可以尝试使用与白色大矩形匹配的模板来标识存储信息的区域

完成后,您将能够识别此区域中的字符。。。保存一个小的子图像,使用PyteSeract之类的工具可以读取字符

这里有一些其他OCR示例:


祝你好运

为什么要使用颜色阈值?我用ImageJ尝试了这个,得到了很好的结果。我只是将图像转换为8位,并使用固定阈值(本例中为166)。您可以从图像中选择最佳阈值。 然后,您只需要找到您的白色矩形区域,并按照建议读取字符

下面是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...
}
#包括“opencv2/imgproc.hpp”
#包括“opencv2/highgui.hpp”
#包括
#包括
使用名称空间cv;
///全局变量
int阈值=166;
常数int thresh_增量=2;
int threshold_type=THRESH_二进制//1.
int const max_值=255;
int const morp_size=3;
int const min_blob_size=1000;
Mat src,src_resized,src_gray,src_thresh,src_morph;
/**
*@主功能
*/
int main(int argc,字符**argv)
{
///加载图像
src=imread(“C:\\Users\\phili\\Pictures\\blatt.jpg”,1);
//调整大小以正确显示
调整大小(src,src_大小调整,大小(600968));
///将图像转换为灰色
CVT颜色(src_大小调整、src_灰色、颜色_RGB2灰色);
///感兴趣区域
Rect-label\u-Rect;
//固定阈值二值化
阈值(src_灰度、src_阈值、thres、最大值、阈值类型);
//使用形态学擦除小对象
Mat元素=getStructuringElement(0,大小(2*变形大小+1,2*变形大小+1),点(变形大小,变形大小));
形态学(src_thresh,src_morph,morph_CLOSE,element);
//查找白色对象及其轮廓
矢量轮廓;
向量层次;
findContours(src_变形、等高线、CV_RETR_树、CV_链约无、点(0,0));
对于(std::vector::iterator it=contours.begin();it!=contours.end();++it)
{
//只是大斑点
如果(it->size()>min\u blob\u size)
{
//近似轮廓并检查矩形
std::向量近似;
APROXPOLYDP(*it,约,0.01*弧长(*it,真),真);
如果(大约尺寸()==4)
{
//只是为了形象化
绘制等高线(src_大小调整,约为0,标量(0,255,255),-1);
//ROI的边界矩形
label_rect=boundingRect(近似值);
//出口回路
打破
}
}
}
//感兴趣区域
Mat label_roi=src_大小调整(label_rect);
//OCR来了。。。
}

您可以阅读如何检测矩形等简单形状感谢@PSchn提供的信息,我已经根据模板匹配更新了结果,但我不知道哪里出错了。我想您混合了两种方法。进行二值化和轮廓查找,以检测矩形或模板匹配例程。我建议做二值化,找到你的轮廓,清理它们,近似一个多边形,。。就这样。我建议您使用模板匹配,然后忘记二值化。模板是否与标签大小相同?您好@FrECM,我对模板匹配进行了更改。但我不知道哪里出了问题。