1

我创建了一个简单的程序来生成随机图像,为每个像素提供随机颜色。我知道生成可协调图像的机会非常低,但我想尝试一下。

我观察到工作中最长的部分是检查图像是否真的是东西。我还观察到,生成的大多数图像只是具有大量单个像素的彩色图像域。这就是为什么我想要求一种伪代码算法来检测图像中相似的颜色区域。我认为找到有意义的图像的最简单方法是过滤所有这些随机像素图像。这并不完美,但我认为它会有所帮助。如果有人可以提出另一种有助于完成这项任务的过滤算法,我也会很感激。

(已编辑)

为了澄清这一点,如果我的解释不够清楚,我将向您展示一些图像:

这就是我得到的图像,基本上我会将其描述为“彩色噪声”。正如你所看到的,所有像素都是单独分布的,没有在相似的颜色区域中分组,以跳跃地创建对象的形状或任何可协调的东西。

在这里你可以看到一个传统的图像,一个“reconocible”图片。我们可以清楚地看到一只狗躺在草地上,手里拿着一个网球。如果你仔细观察这张图片,它可以很明显地与另一张区别开来,因为它有相似的颜色,我们可以区分(如狗,白色区域,草,深绿色区域,网球球,光绿色区域)。

我真正想要的是在将它们保存在高清之前删除“像素”图像,并且只保存具有颜色 agrupations 的图像。正如我之前所说,这个想法是我必须过滤这些随机生成的图像的最佳方法,但如果有人提出另一种更有效的方法,我会非常感激它。

(已编辑)

好的,我认为这篇文章变得太长了......好吧,如果有人想看看这里是我编写的程序的代码。这真的很简单。我已经使用 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")
4

3 回答 3

1

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

  1. 获取图像
  2. 仅使用图像的一种颜色维度,即红色或绿色......或灰色......或分别对每个颜色执行以下操作
  3. 将图像中的所有值相加,并将其保存为图像的“能量”值
  4. 使用 OpenCV 的 Smooth 函数对图像进行模糊处理
  5. 正确模糊图像的技巧是选择内核(也称为过滤器)的大小,使其小于重要特征的宽度,并大于不重要或嘈杂的特征。大小通过定义 param1 和 param2 来控制。见http://opencv.willowgarage.com/documentation/python/imgproc_image_filtering.html
  6. 现在对于输出,将所有值相加得到输出“能量”
  7. 如果输出的能量至少是输入的一半,则保留图像。从技术上讲,数字 5 中的技巧与选择 50% 作为保留或丢弃图像的阈值相同。所以这里更改阈值与更改过滤器大小大致相同。
  8. 可选的。不过无需考虑太多,只需为某些图像集获取这些能量值并通过肉眼选择阈值即可。

怎么了?您过滤掉高频,然后查看是否还有剩余的东西。大多数图像在较低空间频率下具有大量能量。事实上 jpeg 压缩使用这个事实来压缩图像。过滤器必须有一个能量才能正常工作,所以我假设这是真的。

希望这可以帮助!

于 2012-08-26T20:37:26.803 回答
0

如果不确切知道您要达到的目标,就很难提供具体的帮助。但是,阅读您的帐户确实让我想起了我最近看到的一些东西,虽然在实现上完全不同,但有一个相似的最终目标:从随机性中生成可识别的图像。

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

Philip 的项目从随机多边形开始,算法偏爱人脸图像。这里有两个关键点:多边形立即显着减少了随机噪声的数量,因此生成可识别事物的机会显着增加。其次,该算法有利于特定类型的可识别图像:我怀疑您将不得不针对特定类型的图像工作,以便您拥有一些参数来计算估计“可识别性”。

嗯!

于 2012-08-24T17:33:02.103 回答
0

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

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

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

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

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

编辑:一般来说,这样的问题没有确切的算法。您必须对基础数据的属性做出假设。然后使用基本原语(相关性、频域数据、边缘等)并将其结合起来,为您提供解决问题的算法。这是因为此类问题的解决方案是非常特定于数据的。与解决计算机科学算法完全不同。这并不是说信号处理算法没有精确性。但是,您当前的问题和许多其他问题都涉及所谓的随机变量和随机过程。您可能必须搜索是否有人试图在文学或某所大学中解决这个问题。你可以用它作为你的起点。调整该算法以适合您。

于 2012-08-24T09:24:28.217 回答