【问题标题】:Locate a resized subimage inside an image在图像中找到调整大小的子图像
【发布时间】:2012-06-28 02:57:42
【问题描述】:

我在一个项目中工作,每个用户都有一个大头像和这个头像的缩略图。头像为 150x215,缩略图为 50x50。要生成缩略图,用户选择头像内的一个正方形区域,系统会裁剪头像并调整其大小以生成缩略图。

现在我需要一个 70x70 的缩略图。我无法调整 50x50 缩略图的大小,因为它看起来不太好。我的想法是创建一个工具来查找头像内的缩略图,并使用缩略图位置生成新的 70x70 图像。它运行良好,直到我注意到一些缩略图不仅被裁剪,而且被调整大小。当图像被调整大小时,它会丢失像素,这使得逐像素比较变得不可能(所以我无法检测到头像内的缩略图位置)。

有什么方法可以识别缩略图的位置(即使它已调整大小)?我正在使用EMGU 来处理图像。

感谢您的帮助

【问题讨论】:

  • 我猜你一开始没有存储用户选择的坐标?
  • 是的,你是对的。不存储位置。将缩略图与头像进行比较的想法是获取此位置

标签: c# image-processing emgucv


【解决方案1】:

[EDIT1]

看到您的注释,如果您将缩放因子应用于原始头像,那么您可以创建一个应用了相同缩放因子的临时缩略图,然后针对已缩放的头像执行缩略图的统计等效性检查。这看起来像是针对缩略图可能位于化身内的每个位置的缩放化身图像找到缩略图的“差异图像”。对于这些“差异图像”中的每一个,将所有基于像素的差异添加到一个组合的单个数字差异中,并将其存储到一个 2D 数组中,该数组的大小为 x 和 y 位置的维度,缩略图可以放置在缩放的头像图像中(这将小于总头像图像大小,实际上它将是宽度 = avatarWidth - thumbWidth 和 height = avatarHeight - thumbHeight)。在计算完此二维数组的所有单个差异实例后,只需找到数组中的最小值,即要使用的缩放化身中左上角的像素位置。当从这个计算的左上角抓取 70 x 70 时,您当然必须考虑 50 x 50 拇指的新缩放尺寸。

您不必(顺便说一句)存储这个 2D 差异值数组,您可以简单地保存一个使用第一个测试位置的值初始化的最小位置,并且仅在当前位置小于当前最小值这样可以避免增加数组的存储空间。

[原创] 一旦头像图像被调整大小,它也被插值,这对于所有密集目的来说意味着原始像素信息已经在数学上发生了不可逆转的变化。

您可能会更幸运地进入原始缩略图代码,并更改缩略图代码以获取 70 x 70 像素的子图像,然后通过从每一侧再裁剪 10 像素来创建 50 x 50 !!!这是假设您仍然需要 50 x 50 和 70 x 70 的缩略图。

【讨论】:

  • 是的,这对新用户来说是对的,但我需要处理老用户的头像:(
  • 查看编辑!!!但是请记住,使用这种方法,您“很可能”永远不会达到零差值,因此不必期望它。您可能还需要检查负差值。
  • 是的,很遗憾我没有:如果用户选择一个 20x20 的区域,它会被调整为 50x50。如果用户选择一个 100x100 的区域,它也会被调整为 50x50。这发生在任何大小的区域,所以我什至不知道图像是否被调整为大于或小于所选区域:(我开始认为这在我拥有的时间范围内是不可行的:(谢谢无论如何:)
  • 如果没有更多元数据伴随您的图像,这甚至可能是一项几乎不可能完成的任务!!!您正在(没有它)谈论尝试自动关联 2 幅图像的大小和位置,其中 1 幅或两幅图像的大小可能已更改!
  • 是的,看起来像这样 :( 无论如何感谢您的澄清 :) 由于这个 cmets 讨论而标记为答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2010-11-20
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多