用于识别 2D 特征的图像处理

2024-01-04

我创建了一个 iPhone 应用程序,它可以扫描一张方格纸的图像,然后告诉我哪些方块已被涂黑,哪些方块是空白的。

我通过从左到右扫描并使用方格纸的线条作为指导来完成此操作。当我遇到方格纸线时,我开始寻找黑色,直到再次碰到方格纸线。然后,我不再沿着扫描线继续扫描,而是继续完全扫描正方形以查找黑色。然后我继续到下一个盒子。在该行的末尾,我在开始新行扫描之前跳过了很多像素(因为我已经算出了每个盒子的高度)。

这种方法可行,但也存在问题。有时我会把图表线误认为是“黑色”。有时,如果图像倾斜,或者页面上没有均匀的照明,那么我就不会得到好的结果。

我想做的是指定一些“对齐”框,然后调整它们的大小并旋转(和倾斜)图片以与这些框对齐。然后,我在想,一旦我将图像对齐,我就会知道所有盒子在哪里,并且不必扫描盒子,只需扫描盒子的位置内部以查看它们是否是黑色的。这应该更快、更可靠。如果我要对来自相机的图像进行操作,我可以更灵活地要求用户对齐图片以匹配对齐标记,而不必自己对齐图像。

鉴于这是我的第一个图像处理项目,我觉得我正在重新发明轮子。我想要有关如何执行此操作以及是否使用 OpenCV 等库的建议。

I am enclosing an image similar to what I would like processed. I am looking for a list of all squares that have a significant amount of black marking, i.e. A8, C4, E7, G4, H1, J9. enter image description here

需要注意的问题:

  • 图像的光覆盖范围可能不理想,但整个图像应该相对一致(即没有阴影)
  • 所有方块可能都是空的或全黑的,算法需要能够确定
  • 图像可能会围绕任何轴倾斜或旋转。绕 z 轴旋转可能很容易修复。可能会围绕 x 或 y 轴旋转,使图像的一侧比另一侧更宽。但是,如果我实时扫描来自相机的图像,我可以要求用户将对齐标记与屏幕上的标记对齐。如何最好地确保一致性以便为用户提供适当的反馈?当相机指向黑色表面时,仅检查以确保 4 个角是黑色的可能会导致误报。
  • 并不是每个方格都会同样或一致地变黑,但我认为会有足够的黑色使其对人眼来说毫无疑问。
  • 蓝色网格可能有用,但在某些情况下,黑色标记可能会与蓝色网格重叠。我认为虚拟网格可能比依赖打印网格更好。我认为使用对齐标记来对齐图像,然后可以布置精确的虚拟网格。然后可以对每个网格框的内容进行采样,看看它是否主要是黑色,而不是从左到右扫描,不是吗?这是另一张网格上有更多标记的图像。在这张图中,除了之前在A8、C4、E7、G4、H1、J9中标记之外,我还标记了E2、G8和G9,以及I4和J4,你可以看到蓝色网格是如何被遮挡的。
  • 这是我这个项目的第一阶段。最终我想扩展这个算法,使其能够处理至少几百个槽和可能不同的颜色。

首先,这个问题让我想起了一些可能对学习有用的演示:

  • DNA微阵列图像处理 http://www.mathworks.com/matlabcentral/fileexchange/2573-dna-microarray-image-processing-case-study
  • Matlab 数独求解器 http://www.mathworks.com/videos/matlab/sudoku.html
  • Iphone 数独解算器 http://sudokugrab.blogspot.com/2009/07/how-does-it-all-work.html博客文章,解释图像处理

就我个人而言,我认为最简单的方法是检测图像中的正方形。

1)去除背景和小瑕疵

f_makebw = @(I) im2bw(I.data, double(median(I.data(:)))/1.3);
bw = ~blockproc(im, [128 128], f_makebw);
bw = bwareaopen(bw, 30);

2)删除除正方形和圆形之外的所有内容。

se = strel('disk', 5);
bw = imerode(bw, se);

% Detect the squares and cricles via morphology
[B, L] = bwboundaries(bw, 'noholes');

3)使用“extend”检测正方形regionprops。 “范围”指标测量边界框被填充的比例。这使其成为 区分圆形和正方形的好方法

stats = regionprops(L, 'Extent'); 
extent = [stats.Extent];
idx1 = find(extent > 0.8);
bw = ismember(L, idx1);

4) 这样您就可以使用自己的功能来同步或校正图像。要做到这一点,一种简单而可靠的方法是通过自相关函数。

这给出了很容易检测到的漂亮峰值。这些峰值可以通过匈牙利算法与模板图像中的 ACF 峰值进行匹配。一旦匹配,您就可以纠正旋转和缩放,因为您现在有了一个可以求解的线性系统:

x = Ax'

然后可以使用针对相同预定义模板的普通互相关来校正翻译。

如果一切顺利,您就知道有一个对齐或同步的图像,这将有助于确定点的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于识别 2D 特征的图像处理 的相关文章

  • Pyinstaller“无法执行脚本 pyi_rth_pkgres”并且缺少软件包

    这是我第一次在这里发布问题 因为我的大部分问题已经被其他人回答了 我正在 python 中开发 GUI 应用程序 并尝试使用 pyinstaller 将其打包到单个文件夹和 exe 中 以便于移植 目前 我使用 Windows 10 和 a
  • OpenCV:使用 StereoCamera 系统对颜色标记进行 3D 姿态估计

    我有一个立体摄像系统并使用两者正确校准它 cv calibrateCamera and cv stereoCalibrate My reprojection error似乎没问题 凸轮0 0 401427 凸轮1 0 388200 立体声
  • 在 python lib 中导入和裁剪 jpeg 的快速方法

    我有一个 python 应用程序 可以导入 200k 图像 裁剪它们 并将裁剪后的图像呈现给 pyzbar 来解释条形码 裁剪很有帮助 因为图像上有多个条形码 并且当给定较小的图像时 pyzbar 可能会更快一些 目前我正在使用 Pillo
  • Opencv - 找不到头文件

    我正在尝试使用 opencv 开始开发 问题是 到目前为止我几乎无法设置 opencv 因为我找不到它的头文件 我对此主题进行了一些研究 但没有一个真正有帮助 下面是一些链接 opencv2 包含文件在哪里 https stackoverf
  • 如何使用Java OpenCV

    我正在使用图像处理开始我的最后一年项目 并希望完成类似的事情this http www youtube com watch v EPai5f2sWaA 它是人体和物体检测的结合 我真的很想用 Java 来做 因为我在 C 方面的经验很少 I
  • OpenCV 完美识别物体

    我有一个应用程序 我想一次跟踪 2 个在图片中相当小的对象 该应用程序应该在 Android 和 iPhone 上运行 因此算法应该是高效的 对于我的客户来说 如果我们提供一些模式以及附加到要跟踪的对象的软件 以获得易于识别的目标 那就完全
  • 剪切透明零件图像

    The updated image 非常感谢你 但我想做一些不同的事情 将这里的每个矩形剪切为单独的图像 让我们首先尝试找到蓝色块边界 听起来很难 但实际上很简单 看看我到目前为止所做的事情 private unsafe Bitmap Co
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • 使用 OpenCV VideoWriter 将 RTSP 流存储为视频文件

    我正在使用 OpenCV 开发一个 Python 模块 该模块连接到 RTSP 流以对视频执行一些预处理 主要是降低 fps 和分辨率 然后将其存储在文件系统中 但是 即使在尝试了几种编解码器 寻找类似的开发之后 我总是得到一个空的视频 我
  • 警告:发生了非法反射访问操作(java 中的便携式 opencv)

    我想做一个便携的opencv将依赖项添加到 maven 文件的应用程序pom xml 简化的代码是 import org opencv core Mat public class Builder public static void mai
  • OpenCV 旋转图像而不裁剪澄清

    我想扩展这个主题 参考用户 Lars Schillingmann 给出的这个 SO 问题和接受的答案 在 C 中的 OpenCV 中旋转图像而不裁剪 https stackoverflow com questions 22041699 ro
  • opencv如何使用鼠标事件不规则地选择图像区域? c/c++ [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 最近在学习opencv 有没有办法使用鼠标事件选择图像区域 我已经尝试过三角形的了 如果我想选择特定区域而不是三角形怎么办 谢谢你 我对此进
  • 如何将k4a_image_t转换为opencv矩阵? (Azure Kinect 传感器 SDK)

    我开始尝试使用 Azure Kinect Sensor SDK 我经历了官方操作指南 https learn microsoft com en us azure Kinect dk about sensor sdk sensor sdk 我
  • PyTorch 中的数据增强

    我对 PyTorch 中执行的数据增强有点困惑 现在 据我所知 当我们执行数据增强时 我们保留原始数据集 然后添加它的其他版本 翻转 裁剪 等 但 PyTorch 中似乎并没有发生这种情况 据我从参考文献中了解到 当我们使用data tra
  • Opencv 运动检测与跟踪

    我需要在网络摄像头的视频帧中进行强大的运动检测和跟踪 背景总是一样的 目的是识别物体的位置 如果可能的话没有阴影 但并不急于去除阴影 我已经尝试过用于背景减法和阈值化的opencv算法 但这仅取决于一个图像作为背景 如果背景的亮度 或相机自
  • 在 Python 中使用音频流 RTMP 通过管道和 OpenCV 到 FFmpeg

    我正在尝试使用音频流式传输 FFmpeg 我将在下面展示我的代码 导入模块 import subprocess as sp 创建变量 rtmpUrl rtmp a rtmp youtube com live2 key camera path
  • python openCV 中的人口普查变换

    我开始在一个与立体视觉相关的项目中使用 openCV 和 python 我找到了关于使用 openCV 在 C 中进行人口普查转换的文档页面 link http docs opencv org 3 1 0 d2 d7f namespacec
  • 为什么我们应该使用灰度进行图像处理

    我认为这可能是一个愚蠢的问题 但在阅读了大量内容并搜索了很多有关图像处理的内容之后 我看到的有关图像处理的每个示例都使用灰度来工作 我知道灰度图像只使用一个颜色通道 通常只需要 8 位来表示 等等 但是 当我们有彩色图像时为什么要使用灰度呢
  • 如何平滑循环列向量

    这是一个 OpenCV2 问题 我有一个矩阵代表closed空间曲线 cv Mat
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041

随机推荐