搜索在两个目录与​​文件名不同类似的图片(Search for similar images wit

2019-08-01 00:48发布

我有2个目录,有很多和大量的图片,说: 彩色/ 灰色/。颜色/图像被命名为:image1.png image2.png等。

我知道, 灰/包含相同的图像,但在灰度和文件的文件名和顺序是不同的(例如:file_01.png,但是这是不一样的形象image1.png)。

是否有可能使两个目录中的图片的对比和色彩/文件复制到与灰/文件名的成绩 /目录?

例:

directory        | directory           | directory
   "color/"      |     "gray/"         |      "results/" 
(color images)   | (grayscale images)  | (color images with gray-scale names)   
-----------------+---------------------+----------------------------------------
color/image1.png | gray/file324.png    | results/file324.png  (in color: ==>
                                       | this and image1.png are the same image)

我希望这不是很混乱,但我不知道该如何解释好。

我曾尝试与ImageMagick的,而且似乎-compare选项可用于这方面的工作,但我无法作出一个bash脚本或东西做的很好。

另一种方式来表达:我希望所有的color/*.jpg复制到results/*.jpg使用正确的匹配文件夹gray/*.jpg名字。

编辑(一些注意事项):1,三幅图像的大小和内容一致。 唯一的区别是,二者在颜色和一个处于灰度。 和文件的名称,当然。 2.我上传的一个样本图像的压缩文件与他们目前的名称(文件夹“IMG1”颜色的文件夹和文件夹“IMG2”灰度文件夹)和预期的结果(“IMG3”结果文件夹),在这里: http://www.mediafire.com/?9ug944v6h7t3ya8

Answer 1:

如果我理解正确的要求,我们需要:

  • 找到名为XYZ各灰度图像是在文件夹灰色/ ...
  • ...这是在文件夹颜色名为ABC匹配的彩色图像/和...
  • ...复制农行文件夹结果/下的新名称XYZ

所以基本的算法,我建议是这样的:

  1. 转换所有的图像文件夹中的颜色/灰度,结果存储在文件夹中的灰度的参考/。 保留原来的名称:

     mkdir gray-reference convert color/img123.jpg -colorspace gray gray-reference/img123.jpg 
  2. 对于每个参考灰度图像/使用在夹灰/各灰度图像的比较。 如果你找到一个匹配,复制相同名称的颜色/结果/各自的形象。 其中一个产生的差异的视觉表示可能比较命令是这样的:

     compare gray-reference/img123.jpg gray/imgABC.jpg -compose src delta.jpg 

真正的窍门是两个灰度级图像的比较(如在步骤2)。 ImageMagick的有一个方便的命令由像素比较两个(类似)的图像的像素并且将结果写入到“增量”的形象:

compare  reference.png  test.png  -compose src  delta.png

如果比较是彩色图像 ,在增量映像...

  • ...这等于每个像素显示为白色,而...
  • ...这是不同的每个像素出现在高亮颜色(默认为红色)。

另请参阅我的回答“ImageMagick的:‘差异’的形象”这一技术的说明例子。

如果我们直接比较与由像素的彩色图像的像素的灰度图像 ,我们当然会发现,几乎每一个像素是不同(导致全红色“增量”图片)。 因此,从第1步我的建议上面先转换为彩色图像灰度。

如果我们比较两个灰度图像 ,所产生的增量映像是在灰度太。 因此缺省的高亮颜色不能红。 我们最好以将其设置为“黑色”看到它更好。

现在,如果我们对色彩的当前灰度转换将导致灰度比一个现有的灰度图像具有的“不同”的排序(我们目前生产的灰色可能只是比现有的灰度图像稍亮或过暗,由于不同的颜色配置文件已应用),但可能发生,我们的增量画面是清一色的“红色”,或者说所有的高亮颜色。 然而,我与你的样本图像进行了测试,效果都不错:

 convert  color/image1.jpg  -colorspace gray  image1-gray.jpg  
 compare                  \
    gray/file324.jpg      \
    image1-gray.jpg       \
   -highlight-color black \
   -compose src           \
    delta.jpg

delta.jpg由98%的白色像素。 我不知道,如果你的数千灰度图像的所有其他使用相同的设置,当他们从彩色原稿的。 为此,我们在运行时添加少量模糊因数compare命令,并允许在颜色有些偏差时,2个像素进行比较:

compare  -fuzz 3%  reference.png  test.png  -compose src  delta.png

由于这种算法是将要执行的时间成千上万(也许几百万的时候,给你说说图像的数量),我们应该做一些性能方面的考虑,我们应该一次的持续时间compare命令。 这是特别关注的问题,因为你的样本图像是相当大(3072x2048像素 - 6百万像素),比较可能需要一段时间。

在MacBook Pro上,这些地方我时序结果:

time (convert  color/image1.jpg  -colorspace gray  image1-gray.jpg ;
      compare                   \
         gray/file324.jpg       \
         image1-gray.jpg        \
        -highlight-color black  \
        -fuzz 3%                \
        -compose src            \
         delta100-fuzz.jpg)

  real  0m6.085s
  user  0m2.616s
  sys   0m0.598s

6秒:1个转化大的彩色图像的灰度,再加上两个大的灰度图像的1个比较。

你谈到“成千上万的图像”。 假设3000倍的图像,基于该定时中,所有的图像的处理将要求(3000*3000)/2比较(450万)和(3000*3000*6)/2秒(27000000秒)。 这是一个总的312天就可以完成所有的比较。 太长,如果你问我。

我们能做什么来提高性能?

嗯,我的第一个想法是,以减少图像的大小。 如果我们比较小的图像,而不是3072x2048大小的,比较快应该返回结果。 (然而,我们也将花费更多的时间,第一缩放我们的测试图像下来-但希望少得多的时间比我们后来比较小的图像时节省:

time (convert color/image1.jpg  -colorspace gray  -scale 6.25%  image1-gray.jpg  ;
      convert gray/file324.jpg                    -scale 6.25%  file324-gray.jpg ;
      compare                  \
         file324-gray.jpg      \
         image1-gray.jpg       \
        -highlight-color black \
        -fuzz 3%               \
        -compose src           \
         delta6.25-fuzz.jpg)

   real  0m0.670s
   user  0m0.584s
   sys   0m0.074s

这是好多了! 我们剃掉的处理时间,这给希望完成工作35天,如果您使用的是MacBook Pro的近90%。

的改善是唯一的逻辑:通过降低图像尺寸与原始的6.25%所产生的图像是仅192x128像素 - 从600万个像素的减少到24500个像素,256:1的比例。

注: -thumbnail-resize参数,会工作有点快于-scale做然而,这样的速度增长是一个权衡对质量损失质量损失可能会作出比较更可靠......。 )

而不是创建从比较的图像视觉检查的增量映像,我们可以告诉ImageMagick的打印出一些统计数据。 为了得到不同的像素数,我们可以使用AE度量。 其结果的命令是这样的:

time (convert color/image1.jpg -colorspace gray -scale 6.25% image1-gray.jpg  ;
     convert gray/file324.jpg                   -scale 6.25% file324-gray.jpg ;
     compare -metric AE  file324-gray.jpg image1-gray.jpg -fuzz 3% null: 2>&1 )
0 

  real  0m0.640s
  user  0m0.574s
  sys   0m0.073s

这意味着我们有0不同的像素-我们可以直接在shell脚本中使用的结果!

构建块的shell脚本

因此,这里有一个shell脚本做自动比较积木:

  1. 从“颜色/”目录下的灰度转换那些彩色图像,它们缩小至6.25%,并保存结果“参考色/”目录:

     # Estimated time required to convert 1000 images of size 3072x2048: # 500 seconds mkdir reference-color for i in color/*.jpg; do convert "${i}" -colorspace gray -scale 6.25% reference-color/$(basename "${i}") done 
  2. 缩小从“灰色/目录图像,并保存在“参考灰度/”目录的结果:

     # Estimated time required to convert 1000 images of size 3072x2048: # 250 seconds mkdir reference-gray for i in gray/*.jpg; do convert "${i}" -scale 6.25% reference-gray/$(basename "${i}") done 
  3. 每个图像从目录比较,直到从匹配目录“参考色”图像“参考灰色/”是发现:

     # Estimated time required to compare 1 image with 1000 images: # 300 seconds # If we have 1000 images, we need to conduct a total of 1000*1000/2 # comparisons to find all matches; # that is, we need about 2 days to accomplish all. # If we have 3000 images, we need a total of 3000*3000/2 comparisons # to find all matches; # this requires about 20 days. # for i in reference-gray/*.jpg ; do for i in reference-color/*.jpg ; do # compare the two grayscale reference images if [ "x0" == "x$(compare -metric AE "${i}" "${j}" -fuzz 3% null: 2>&1)" ]; then # if we found a match, then create the copy under the required name cp color/$(basename "${j}" results/$(basename "${i}") ; # if we found a match, then remove the respective reference image (we do not want to compare again with this one) rm -rf "${i}" # if we found a match, break from within this loop and start the next one break ; fi done done 

警告:不要盲目依赖这些积木。 他们是未经检验的。 我没有可用来测试这个倍数适合图像的目录,我不希望创建一个自己只是为了这项工作。 请谨慎操作!



Answer 2:

你应该尝试,如果一个感性的哈希算法 ,如pHash给您具体的数据有个好的结果。

的知觉散列会给你一个可靠的相似性度量,因为底层算法是足够鲁棒以考虑更改/变换,如对比度调整或不同的压缩/格式 - 这是不符合标准的加密散列函数,如MD5的情况。

此外,如果pHash工作原理是利用其便利的基于网络的,你可以验证演示界面上自己的图像。



Answer 3:

Kurt的解决方案做一些调整后,非常作品,并与-fuzz选项摆弄! :)对于-fuzz终于行之有效的最终值是50%! 我试图与3,10,19,20,24,25,30和没有成功的40%。 大概是因为灰度图像用一个不同的方法预先生成的,所以灰色是不同的。 此外,所有的图像的大小不同,有些人比较少,所以按百分比换算方法产生不好的结果。 我用-resize 200x ,因此,所有的参考图像或多或少相同的大小,最后这是我使用的bash脚本:

    # this bash assumes the existence of two dirs: color/ and gray/ 
    # each one with images to compare

    echo Starting...
    echo Checking directories...
    if [ ! -d color ]; then
        echo Error: the directory color does not exist!
        exit 1;
    fi
    if [ ! -d gray ]; then
        echo Error: the directory gray does not exist!
        exit 1;
    fi

    echo Directories exist. Proceeding...

    mkdir reference-color
    echo creating reference-color...
    for i in color/*.png; do
        convert  "${i}"  -colorspace gray  -resize 200x  reference-color/$(basename "${i}")
    done
    echo reference-color created...

    mkdir reference-gray
    echo creating reference-gray...
    for i in gray/*.png; do
        convert  "${i}"  -resize 200x  reference-gray/$(basename "${i}")
    done
    echo reference-gray created...

    mkdir results
    echo created results directory...

    echo ...ready.

    echo "-------------------------"
    echo "|  starting comparison  |"
    echo "-------------------------"

    for i in reference-gray/*.png; do
        echo comparing image $i 

        for j in reference-color/*.png; do

            # compare the two grayscale reference images

            if [ "x0" == "x$(compare  -metric AE "${i}"  "${j}" -fuzz 50% null: 2>&1)" ]; then

                # if we found a match, then create the copy under the required name
                echo Founded a similar one. Copying and renaming it...
                cp color/$(basename "${j}")  results/$(basename "${i}")

                # if we found a match, then remove the respective reference image (we do not want to compare again with this one)
                echo Deleting references...
                rm -rf "${i}"
                rm -rf "${j}"
                echo "--------------------------------------------------------------"

                # if we found a match, break from within this loop and start the next one
                break ;

            fi

        done

    done
    echo Cleaning...
    rm -rf reference-color
    rm -rf reference-gray
    echo Finished!

时间的措施是(180幅图像,使用Cygwin的ImageMagick的,所以很可能在本地Linux ImageMagick的更好,我还不知道):

real    5m29.308s
user    2m25.481s
sys     3m1.573s

我上传的脚本文件和设置的测试图像如果有人有兴趣。 http://www.mediafire.com/?1ez0gs6bw3rqbe4 (与7Z格式压缩)

再次感谢!



文章来源: Search for similar images with different filenames in two directories