我想识别信用卡上的数字.更糟糕的是,源图像不能保证高质量.OCR将通过神经网络实现,但这不应该是这里的主题.
当前的问题是图像预处理.由于信用卡可以具有背景和其他复杂图形,因此文本不像扫描文档那样清晰.我用边缘检测(Canny Edge,Sobel)进行了实验,但并没有那么成功.同时计算灰度图像和模糊图像之间的差异(如OCR图像处理中的删除背景颜色所述)不会导致OCRable结果.
我认为大多数方法都失败了,因为特定数字与其背景之间的对比不够强.可能需要将图像分割成块并为每个块找到最佳的预处理解决方案?
您对如何将源转换为可读二进制图像有任何建议吗?边缘检测是要走的路还是我应该坚持基本的颜色阈值?
这是一个灰度阈值方法的示例(我显然对结果不满意):
原始图片:

灰度图像:

阈值图像:

感谢任何建议,Valentin
嗨,目前我正在开发一个OCR阅读应用程序,我已成功地使用AVFoundation框架捕获卡片图像.
下一步,我需要找出卡的边缘,以便我可以从主捕获的图像中裁剪卡片图像,然后我可以将其发送到OCR引擎进行处理.
现在的主要问题是找到卡的边缘,我正在使用下面的代码(取自另一个开源项目),该代码使用OpenCV用于此目的.如果卡是纯矩形卡或纸,它工作正常.但是当我使用圆角卡(例如驾驶执照)时,它无法检测到.另外我在OpenCV上没有太多的专业知识,任何人都可以帮我解决这个问题吗?
- (void)detectEdges
{
cv::Mat original = [MAOpenCV cvMatFromUIImage:_adjustedImage];
CGSize targetSize = _sourceImageView.contentSize;
cv::resize(original, original, cvSize(targetSize.width, targetSize.height));
cv::vector<cv::vector<cv::Point>>squares;
cv::vector<cv::Point> largest_square;
find_squares(original, squares);
find_largest_square(squares, largest_square);
if (largest_square.size() == 4)
{
// Manually sorting points, needs major improvement. Sorry.
NSMutableArray *points = [NSMutableArray array];
NSMutableDictionary *sortedPoints = [NSMutableDictionary dictionary];
for (int i = 0; i < 4; i++)
{
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSValue valueWithCGPoint:CGPointMake(largest_square[i].x, largest_square[i].y)], @"point" , [NSNumber numberWithInt:(largest_square[i].x + largest_square[i].y)], @"value", nil];
[points addObject:dict];
}
int min = …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenCV(Canny + findCountours)来查找对象的外部轮廓.绘制的曲线通常几乎(但不是完全)是闭合的.我想关闭它 - 找到它所包含的区域.
我该怎么做呢?
事情考虑:
我对一些问题Canny边缘检测中的OpenCV。
这是我试过的代码。
def auto_canny(image, sigma=0.33):
v = np.median(image)
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(image, lower, upper)
Run Code Online (Sandbox Code Playgroud)
然后,
##### first situation #####
img = cv2.imread('mango.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
auto = auto_canny(gray)
cv2.imwrite('mango_gray_edge.jpg', auto)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到了这样的图像:

##### second situation #####
img = cv2.imread('mango.jpg')
auto = auto_canny(img)
cv2.imwrite('mango_color_edge.jpg', auto)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到了这样的图像:

这是原始图像:

第一种情况和第二种情况的区别在于我是否将彩色图像转换为灰度。但是,我对此感到困惑。因为,
在第一种情况下,我将图像转换为灰度,因此图像具有单个通道。而在第二种情况下,图像仍然具有三个通道。
当我没有将其转换为灰度时,边缘会好得多,就像在第二种情况下一样。
所以我的问题是,
OpenCV 中的 Canny 函数是否包括将图像转换为灰度的方法?我的意思是,我需要在使用之前将图像转换为灰度cv2.Canny()吗?
Canny 如何同时处理单通道(第一种情况转换为灰度)和三通道(原始图像如第二种情况)图像?
Canny实际上是如何工作的?Canny …
我正在尝试在图像上应用Sobel滤镜以使用scipy来检测边缘.我在Windows 7旗舰版(64位)上使用Python 3.2(64位)和scipy 0.9.0.目前我的代码如下:
import scipy
from scipy import ndimage
im = scipy.misc.imread('bike.jpg')
processed = ndimage.sobel(im, 0)
scipy.misc.imsave('sobel.jpg', processed)
Run Code Online (Sandbox Code Playgroud)
我不知道我做错了什么,但处理过的图像看起来并不像它应该做的那样.图像'bike.jpg'是灰度(模式'L'而非'RGB')图像,因此每个像素只有一个与之关联的值.
不幸的是我还没有在这里发布图片(没有足够的声誉),但我提供了以下链接:
原始图像(bike.jpg):http://s2.postimage.org/64q8w613j/bike.jpg
Scipy Filtered(sobel.jpg):http://s2.postimage.org/64qajpdlb/sobel.jpg
预期产出:http: //s1.postimage.org/5vexz7kdr/normal_sobel.jpg
我显然在某个地方出错了!有人可以告诉我在哪里.谢谢.
我正在寻找高斯边缘检测拉普拉斯的等效实现.
在matlab中我们使用以下函数
[BW,threshold] = edge(I,'log',...)
Run Code Online (Sandbox Code Playgroud)
在python中存在用于计算高斯拉普拉斯函数的函数.它没有明确地给予边缘.
scipy.ndimage.filters.gaussian_laplace
Run Code Online (Sandbox Code Playgroud)
任何指向在线实现或代码的指针
谢谢
python image-processing edge-detection imagefilter laplacianofgaussian
有谁知道边缘检测算法中Prewitt,Sobel和Laplacian算子之间的差异是什么?
有些人比其他人好吗?
在不同情况下使用不同的运算符吗?
我需要从太空中探测太阳.
这些是输入图像的示例:

我在Morphologic过滤后得到了这样的结果(open两次操作)

这是此处理的算法代码:
// Color to Gray
cvCvtColor(image, gray, CV_RGB2GRAY);
// color threshold
cvThreshold(gray,gray,150,255,CV_THRESH_BINARY);
// Morphologic open for 2 times
cvMorphologyEx( gray, dst, NULL, CV_SHAPE_RECT, CV_MOP_OPEN, 2);
Run Code Online (Sandbox Code Playgroud)
对于这么简单的任务,处理不是太重了吗?如何找到太阳的中心?如果我找到白点,我会发现大地球的白点(第一个示例图像上的左上角)
请告诉我,我的进一步行动是为了探测太阳.
更新1:
尝试centroid按公式获取算法:{x,y} = {M10/M00, M01/M00}
CvMoments moments;
cvMoments(dst, &moments, 1);
double m00, m10, m01;
m00 = cvGetSpatialMoment(&moments, 0,0);
m10 = cvGetSpatialMoment(&moments, 1,0);
m01 = cvGetSpatialMoment(&moments, 0,1);
// calculating centroid
float centroid_x = m10/m00;
float centroid_y = m01/m00;
cvCircle( image,
cvPoint(cvRound(centroid_x), cvRound(centroid_y)),
50, CV_RGB(125,125,0), 4, 8,0); …Run Code Online (Sandbox Code Playgroud) 我想将OCR应用于墙上7段显示的一些图片.我的策略如下:
如何设置ROI以便我的程序不必在整个图像中查找模板?我想根据找到的边数设置我的投资回报率,或者如果有人可以帮助我,那么更有用的东西.
我正在研究Cascade Classification和Haar,但我不知道如何将它应用到我的问题中.
这是经过预处理和边缘检测后的图像:

原始图像

Heroku Cedar-14堆栈目前运行的ImageMagick版本(6.7.7-10)已有近一年的历史:
Running `identify -version` attached to terminal... up, run.8227
Version: ImageMagick 6.7.7-10 2014-03-06 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP
Run Code Online (Sandbox Code Playgroud)
我想使用-canny在图像中执行边缘检测的选项,但这只是在ImageMagick的更高版本中引入的.
Heroku上唯一可用的ImageMagick构建包不适用于Cedar-14堆栈:https: //github.com/mcollina/heroku-buildpack-imagemagick
有没有办法在Heroku上使用ImageMagick v6.8.9-0或更高版本?
提前致谢!
edge-detection ×10
opencv ×5
python ×3
c++ ×2
avfoundation ×1
contour ×1
curve ×1
heroku ×1
imagefilter ×1
imagemagick ×1
ios ×1
ocr ×1
scipy ×1
uiimage ×1