如何检测图像中的相似颜色区域?

时间:2012-08-23 16:50:13

标签: image image-processing

我创建了一个简单的程序来生成随机图像,为每个像素提供随机颜色。我知道生成可重新映射图像的可能性很小,但我想尝试一下。

我观察到,最长的部分是检查图像是否确实存在。我还观察到,产生的大多数图像只是具有大量单个像素的彩色图像的场。这就是为什么我想要一个伪代码算法来检测图像中相似的颜色区域。我认为找到有意义的图像的最简单方法是过滤所有这些随机像素图像。这不完美,但我认为这会有所帮助。 如果有人可以提出另一种有助于完成此任务的过滤算法,我也会对此进行更新。

(编辑)的

为了澄清这一点,如果我的解释不够清楚,我会给你看一些图片:

这是我得到的那种图像,基本上我会把它形容为“多彩的噪音”。正如您所看到的,所有像素都是单独传播的,无需在相似的颜色区域中进行分组,从而可以快速创建对象的形状或任何可重新构造的对象。

在这里你可以看到一个传统的图像,一个“可重新连接”的图片。我们可以清楚地看到一只狗躺在草地上用网球。如果你仔细观察这张照片,它可以与另一张照片清楚地区分开来,因为它有相似颜色的混乱,我们可以不同(如狗,白色区域,草地,深绿色区域和天花球,灯光绿色地区)。

我真正想要的是在将它们保存在HD中之前删除“像素化”图像,并且仅保存具有颜色中断的图像。正如我之前所说的,这个想法是我必须过滤这些随机生成的图像的最好的想法,但如果有人提出另一种更有效的方法,我真的会对它进行预测。

(编辑)的

好吧,我认为这篇文章变得太长了...如果有人想看看这里是我写的程序的代码。这真的很简单。我使用Pygame在Python中编程。我知道这不是最有效的方法,我知道这一点。问题是我在这个领域是一个非常的菜鸟,我真的不知道用其他语言或模块做另一种方法。也许你可以帮助我...我不知道,也许将代码翻译成C ++?我觉得我在同一篇文章中要求提出很多问题,但正如我所说的那样,任何帮助都会有很大的帮助。

import pygame, random
pygame.init()

#lots of printed text statements here

imageX = int(input("Enter the widht of the image you want to produce: "))
imageY = int(input("Enter the height of the image you want to produce: "))
maxImages = int(input("Enter the maximun image amoungt you want to produce: "))
maxMem = int(input("Enter the maximun data you want to produce (MB, only works with     800x600 images): "))
maxPPS = int(input("Enter the maximun image amoungt you want to produce each second: "))
firstSeed = int(input("Enter the first seed you want to use: "))

print("\n\n\n\n")

seed = firstSeed
clock = pygame.time.Clock()
images = 0
keepGoing = True

while keepGoing:

    #seed
    random.seed(seed)

    #PPS
    clock.tick(maxPPS)

    #surface
    image = pygame.Surface((imageX,imageY))

    #generation
    for x in range(imageX):
        for y in range(imageY):
            red = random.randint(0,255)
            green = random.randint(0,255)
            blue = random.randint(0,255)

            image.set_at((x,y),(red,green,blue))

    #save
    pygame.image.save(image,str(seed)+".png")

    #update parameters
    seed += 1
    images += 1

    #print seed
    print(seed - 1)

    #check end
    if images >= maxImages:
        keepGoing = False
    elif (images * 1.37) >= maxMem:
        keepGoing = False

    pygame.event.pump()


print("\n\nThis is the last seed that was used: " + str(seed - 1))
input("\nPress Enter to exit")

3 个答案:

答案 0 :(得分:1)

这是一个可以尝试的屠宰算法(在OpenCV中尝试):

  1. 获取图片
  2. 只使用图像的一个颜色尺寸,即红色或绿色...或灰色......或单独执行以下操作
  3. 将图像中的所有值相加并将其保存为图像的“能量”值
  4. 使用OpenCV的平滑功能模糊图像
  5. 正确模糊图像的技巧是选择内核(也称为滤镜)的大小小于重要特征的宽度,并且大于不重要或嘈杂的特征。通过定义param1和param2来控制大小。 请参阅http://opencv.willowgarage.com/documentation/python/imgproc_image_filtering.html
  6. 现在输出结果,总结所有值以获得输出“能量”
  7. 如果输出至少是输入能量的一半,请保留图像。从技术上讲,数字5中的技巧与选择50%作为保留或丢弃图像的阈值相同。因此,此处更改阈值与更改过滤器大小大致相同。
  8. 可选。不需要过多考虑它,只需为某些图像获取这些能量值并通过眼睛选择阈值。
  9. 发生了什么事? 你过滤掉高频然后看看是否还剩下一些东西。大多数图像在较低的空间频率下具有大量能量。实际上,jpeg压缩使用这个事实来压缩图像。过滤器必须具有1的能量才能正常工作,所以我假设这是真的。

    希望这有帮助!

答案 1 :(得分:0)

滤除噪声的最简单方法是寻找相关性。在大部分图像中,附近区域应该高度相关。有很多方法可以做到。

您应该使用以下组合并进行一些调整以找到参数以获得可接受的命中/未命中率

颜色相关性:在“正确”图像中,您会发现附近区域的U / V存在大量相关性。

边缘检测:自然图像往往具有明确的边缘。检测自然图像噪声的最简单方法就是这样做。

可以做的更多:频率分析:噪声图像将具有所有频率,自然图像通常具有巨大的峰值。缩放空间分析等取决于您想要获得的复杂程度。您愿意容忍多少命中率。一般来说,尝试获取可识别的图像是一个开放式的主题,但如果你特别想要删除像你在示例中给出的那样的噪声图像,你应该能够获得非常高的命中率。

编辑: 一般来说,没有针对此类问题的精确算法。您必须对基础数据的属性进行假设。然后使用基本原语(相关,频域数据,边缘等)并将其组合以提供解决问题的算法。这是因为这类问题的解决方案非常具体。与解决计算机科学算法完全不同。这并不是说信号处理算法没有精确性。然而,您当前的问题和许多其他问题涉及所谓的随机变量和随机过程。您可能需要搜索是否有人试图在文献或某些大学中解决此问题。您可以将其作为起点。调整该算法以适应您。但是,除非你花些时间了解我提到的一些事情并愿意做一些实验和经验分析,否则你不会轻易得到解决方案。

答案 2 :(得分:0)

如果不确切知道自己要实现的目标,就很难提供具体的帮助。但是,阅读您的帐户确实让我想起了我最近看到的一些内容,虽然在实现方面有很大不同,但它们有一个类似的最终目标:从随机生成可识别的图像。

查看Philip McCarthy的https://github.com/phl/pareidoloop

菲利普的项目以随机多边形开始,算法有利于面部图像。这里有两个关键点:多边形显着减少了蝙蝠的随机噪声量,因此产生可识别的东西的机会显着增加。其次,该算法支持特定类型的可识别图像:我怀疑你将不得不面向特定类型的图像,以便你有一些参数可用于计算估计“可识别性”。

HTH!