我是一名本科生。我是图像处理和python的新手。
我有很多植物样品的图片和它们的描述(称为标签,贴在样品上),如下图所示。我需要从样本中自动分割那些标签。
我尝试了基于颜色的阈值设置,但失败了。你能给我举个例子来做这个任务吗?我需要一些想法或代码,使其完全自动分割。
如果你是图像处理和Python方面的专家,请帮助我,我需要你的帮助来完成这个任务。
在左上角检测到矩形,但它应该在右下角。你能告诉我我的错误在哪里以及如何改正吗?我也给出了下面的代码
您可以尝试使用与大白色矩形匹配的模板来标识信息存储区域。
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/
为什么要使用颜色阈值?我用ImageJ尝试了这个,得到了很好的结果。我只是将图像转换为8位并使用固定阈值(在本例中为166)进行二值化。您可以从图像直方图中选择最佳阈值。然后你只需要找到你的白色矩形区域,并像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...
}