从图像1中提取image2

时间:2016-05-07 14:39:04

标签: image image-processing image-segmentation

我希望在文字周围画出有形的框,如图像Image 2 来自Image 1。任何人都可以建议我做一个好的方法或一些算法或turorial什么?。

2 个答案:

答案 0 :(得分:0)

由于您还没有建议使用工具,我将直接在命令行中使用ImageMagick,因为它安装在大多数Linux发行版上,可用于OSX和Windows。它还有PHP,Perl,Python和.Net绑定。

所以,由于你的背景是统一的(ish),你可以使用trim来修剪它:

convert image.jpg -fuzz 20% -trim result.jpg

enter image description here

现在你可以添加这样的边框:

convert result.jpg -bordercolor black -border 5 result.jpg

enter image description here

除非您希望保留其他灰色背景,否则不适合您。因此,我们可以向ImageMagick询问"将" 修剪,而不是实际修剪它,而不是实际修剪:

convert image.jpg -fuzz 20% -format %@ info:
81x22+1+14

所以,我们知道它会使一个81x22px的盒子从左边开始1个像素,从顶部开始向下14个像素,所以我们只是在那里画一个矩形而不是修剪它:

convert image.jpg -fill none -stroke black -draw "rectangle 1,14 82,36" result.jpg

enter image description here

或者,如果你想要大纲更胖:

convert image.jpg -fill none -stroke black -strokewidth 5 -draw "rectangle 1,14 82,36" result.jpg

enter image description here

答案 1 :(得分:-1)

对于统一背景,一个简单的解决方案是识别与背景颜色不匹配的所有像素,然后在这些像素的每个轴中找到最小和最大索引以定义矩形。

例如,如果您使用的是Matlab,则可能类似于:

  1. 使用'找到'识别非背景像素(例如,linearIndices = find(〜(image1 == background)),其中背景是对应于背景像素的RGB值的硬编码组或者由图像的模式识别的一组RGB值。
  2. '查找'将返回线性索引而不是下标(即3x3矩阵的右下角为9,而不是[3,3])因此请使用' ind2sub'转换为下标(例如[I,J] = ind2sub(imageSize,linearIndices)
  3. 使用' max'和' min'找到x和y的范围(例如rangeX = [min(I)max(I); rangeY = [min(J)max(J)])
  4. 将最小和最大索引的像素更改为边框颜色。例如,image1(rangeX(1),rangeY(1):rangeY(2))= boxColour(其中boxColour是您想要框的颜色的RGB值)将绘制框的左边框。对其他三个边框重复此过程,您就完成了。
  5. 当然,这种方法只有在背景完全均匀的情况下才有效。它还假设您只想绘制一个像素厚的边框。 虽然功能建议专门针对Matlab功能,但这些功能背后的思考过程可能会被移植到其他地方。