ImageMagick の例 --
画像比較
- 目次
-
ImageMagick の例 はじめに と 目次
-
画像比較の方法 -- 何が違うのか?
-
比較統計 -- どの程度違うのか?
-
部分画像の照合と位置特定 大きな画像の中から小さな画像を探す。
-
重複画像の検索 -- 同じ画像を2つ見つける
-
種類による画像のソート -- 比較のための画像分類
-
特定の画像タイプの扱い
-
画像メトリクス -- 比較のための画像のフィンガープリント
-
ウェブカメラ -- 固定カメラで何が変更されたかを見つける
画像比較の方法
compare プログラム
"magick compare
" プログラムは、2つの類似した画像を比較して、画像がどの程度「異なっている」かを簡単に判断できるようにするために提供されています。たとえば、ここではアニメーションの「バッグ」の2つのフレームがあり、次に "magick compare
" に渡して、変更された領域を強調表示しました。ご覧のとおり、2番目の画像の「影」がある白と赤の画像が表示されます。2つの画像間で3つの領域が変更されたことが明確に示されています。「比較」画像を保存するのではなく、特別な "x:
" 出力形式に出力したり、"display
" プログラムを使用したりすることで、より便利なように直接表示できます。例えば、以下のようにします。
magick compare bag_frame1.gif bag_frame2.gif x: magick compare bag_frame1.gif bag_frame2.gif miff:- | display |
|
![]() |
|
![]() |
-compose src
" を追加して削除できます。
|
![]() |
|
![]() |
magick bag_frame1.gif bag_frame1.jpg magick compare bag_frame1.gif bag_frame1.jpg magick compare_lossy_jpeg.gif |
![[IM Output]](../images/bag_frame1.gif)
![[IM Output]](bag_frame1.jpg)

![[IM Output]](compare_lossy_jpeg.gif)
magick compare
" は多くの違いを報告します。小さな ファズファクター を使用することで、2つの画像間のこれらの小さな違いを無視するように IM に要求できます。
|
![]() |
-metric
" 設定の 'AE
' (「Absolute Error (絶対誤差)」の略) は、現在のファズファクターでマスクされたピクセルの実際の数を (標準エラーに) 報告します。差分画像
画像が正確にどの程度異なるかをよりよく理解するには、より正確な 'difference
' 合成画像を取得する方がおそらく良いでしょう...
|
![]() |
magick compare
" は JPEG が画像間に多くの違いを生み出したことを示しましたが、'difference
' 合成はかなり暗く、すべての違いが比較的わずかであることを示しています。結果の画像が暗すぎて違いがわからない場合は、画像を 正規化 して (より数学的に正しい "-auto-level
" を使用)、結果を強調表示することをお勧めします。
|
![]() |
|
![]() |
difference
' 合成メソッドは結合性があるため、上記の例の2つの画像の順序は重要ではありませんが、"magick compare
" とは異なり、異なるサイズの画像を比較でき、目的画像のサイズによって差分画像の最終サイズが決まります。異なるメソッドは、結果を保存または表示する前に結果の画像をさらに処理できるため、"magick
" プログラムで使用するとさらに便利です。たとえば、各カラーチャネルを閾値処理してマージすることにより、2つの画像間で色が変わったピクセルのマスクを生成できます。
|
![]() |
magick compare
" プログラムが行うことですが、色と出力スタイルに関するより多くのコントロールがあります。ただし、ご覧のとおり、2つの画像間のごく小さな変化も見つける傾向があります。画像が JPEG などの非可逆画像ファイル形式、または色の削減とディザリング (色の量子化) を必要とする GIF 画像からのものである場合、画像内のすべてが一致する可能性があります。そのため、通常はあまり役に立ちません。より良い結果を得るには、ピクセルカラーがどの程度異なるかを把握してみてください。たとえば、結果をグレースケール化して、カラフルな画像よりも優れた比較画像を取得できます。
|
![]() |
magick compare
" とは異なり、差分画像は、最終結果に結合された両方の画像の混合物を示します。たとえば、猫の額に現れる奇妙な「護符」を見てください。これはもともと最初の画像からのバッグのハンドルでした。このマージにより、実際にどのような違いが見えているのかが混乱し、画像からの追加と削除の両方がマージされているのがわかります。この詳細の混乱のため、"magick compare
" は通常、私たち人間が見るのに最適な方法ですが、「差分」画像は画像をさらに処理するためのより良い方法です。ただし、差分画像をグレースケール化すると、RGB距離が平均化 (実際には加重平均) されます。その結果、単一ビットの色の違いが 量子丸め効果 によって失われる可能性があります。画像間のごくわずかな違いでも重要な場合は、差分画像の個別のカラーチャネルを追加して、最も小さな違いを含め、すべての違いをキャプチャすることをお勧めします。
|
![]() |
|
![]() |
|
![]() |
-colorspace Gray
' 差分画像 (上記) で取得するものと非常によく似ていますが、色の違いをより正確に表しています。2番目の「Pow 0.5
」の変更を省略すると、二乗差分画像が得られます。他にも色の距離メトリクスがあり、色の違い、ウィキペディアページで読むことができます。これらのほとんどには、ベクトル差分を生成することが含まれます (最後を参照)。ただし、LABやLUVなどの異なる色空間を使用します。ただし、これは現実世界の色差を比較する場合 (例: 人間の視覚差測定) により重要になります。また、上記の差分画像を使用して背景の削除を実行する 背景の削除 も参照してください。また、変更検出に関するこの外部ページを、その実用的な使用例として参照することもできます。フリッカー比較
画像間の違いを確認する "magick compare
" プログラムの代わりに、類似した画像間で適度に高速な速度でフリッカー比較を行うことができます。
|
![]() |
flicker_cmp
" というスクリプトを作成しました。また、表示されている画像の下部にラベルを追加して、特定の瞬間にどの画像が表示されているかを詳しく説明します。アニメーションの比較
また、特別な「フィルムストリップ」技術を使用して、2つの結合されたアニメーションの違いを比較することもできます。並べて追加で同様の「追加」技術を参照してください。基本的に、アニメーションのすべてのフレームを結合して、1つの大きく長い画像を作成します。次に、2つの画像を比較し、アニメーションを再び個別のフレームに分割して、新しいアニメーションを作成します。たとえば...
magick \( anim1.gif -coalesce -append \) \ \( anim2.gif -coalesce -append \) miff:- | \ magick compare - miff:- |\ magick - -crop 160x120 +repage anim_compare.gif |
-crop
" サイズがアニメーションの元のサイズと一致する必要があります。また、アニメーションは、元のアニメーションの最初のフレームに基づいて一定の時間の遅延を使用して、アニメーションが持つ可能性のある可変時間の遅延を失います。アニメーションに役立つ別の画像比較技術は、アニメーションが変化するすべての領域を特定するために使用され、アニメーションの接続されていない部分を分割します。このようにして、大きなアニメーションを小さなアニメーションに分割できます。アニメーションの分割を参照してください。比較統計
2つの画像はどの程度異なるのでしょうか?


Statistics from difference image... The following outputs verbose information and extracts just the section containing the channel statistics of the image.... magick image1 image2 -compose Difference -composite \ -colorspace gray -verbose info: |\ sed -n '/statistics:/,/^ [^ ]/ p' The numbers in parenthesis (if present) are normalized values between zero and one, so that it is independent of the Q level of your IM. If you don't have these numbers, you should think of upgrading your IM. To get the average (mean) grey level as a percentage you can use this command... magick image1 image2 -compose Difference -composite \ -colorspace gray -format '%[fx:mean*100]' info: For non-percentage you can use the even simplier.. magick image1 image2 -compose Difference -composite \ -colorspace gray -format '%[mean]' info: Compare Program Statistics... You can get an actual average difference value using the -metric magick compare -metric MAE image1 image2 null: 2>&1 Adding -verbose will provide more specific information about each separate channel. magick compare -verbose -metric MAE rose.jpg reconstruct.jpg null: 2>&1 Image: rose.jpg Channel distortion: MAE red: 2282.91 (0.034835) green: 1853.99 (0.0282901) blue: 2008.67 (0.0306503) all: 1536.39 (0.0234439) Their are a number of different metrics to chose from. With the same set of test images (mostly the same) Number of pixels AE ...... Absolute Error count of the number of different pixels (0=equal) This value can be thresholded using a -fuzz setting to only count pixels that have a larger then the threshold. As of IM v6.4.3 the -metric AE count is -fuzz effected. so you can discount 'minor' differences from this count. magick -metric AE -fuzz 10% image1.png image2.png null: Which pixels are different can be seen using the output image (ignored in the above command). This is the ONLY metric which is 'fuzz' effected. Maximum Error (of any one pixel) PAE ..... Peak Absolute Error (within a channel, for 3D color space) PSNR .... Peak Signal to noise ratio (used in image compression papers) The ratio of mean square difference to the maximum mean square that can exist between any two images, expressed as a decibel value. The higher the PSNR the closer the closer the images are, with a maximum difference occurring at 1. A PSNR of 20 means differences are 1/100 of maximum. Average Error (over all pixels) MAE ..... Mean absolute error (average channel error distance) MSE ..... Mean squared error (averaged squared error distance) RMSE .... (sq)root mean squared error -- IE: sqrt(MSE) Specialized metrics MEPP .... Normalized Mean Error AND Normalized Maximum Error These should directly related to the '-fuzz' factor, for images without transparency. With transparency, makes this difficult the mask should effect the number of pixels compared, and thus the 'mean' but this is currently not done. FUZZ fuzz factor difference taking transparency into account NCC normalized cross correlation (1 = similar) I produced the following results on my test images... _metric_|__low_Q_jpeg__|__black_vs_white__ PSNR | 29.6504 | 0 PAE | 63479 | 65535 MAE | 137.478 | 65535 MSE | 4.65489e+06 | 4.29484e+09 RMSE | 2157.52 | 65535 The first column of numbers is a compare of images with low-quality JPEG differences, where the test image was read in and saved with a very low -quality setting. The second "black vs white", is a compare of a solid black image verses a solid white image. If the 'average color' of the image is ignored by the comparision then the resulting value will be very small. This seems only to be the case with the PSNR metric, as all others produced a maximum difference value. The e+06 is scientific notation, on how many places to shift the decimal point. EG: 4.65489e+06 --> 4,654,890.0 Thus is equal to about 4 million, and is the square of 2157.52 WARNING: numbers are dependant on the IM Quality (Q) levels set at compile time. The higher the quality the larger the numbers. Only PSNR should be unaffected by this. For this reason IM also gives you a 'normalized' result that is uneffected by the compile time quality setting, though may still have minor 'quantum' or 'interger rounding' effects. I have NOT figured out if there are any of the existing "-define" options usable the "compare" function. NOTE for opaque colors AE -fuzz and RMSE distances are equivelent. HOWEVER, when transparent colors are involved AE fuzz factor testing will treat two different fully-transparent colors as being the same while RMSE will treate them as being different! For example... To AE fully-transparent white and fully-transparent black are the same. magick compare -metric AE xc:#0000 xc:#FFF0 null: 0 But to RMSE they are VERY different magick compare -metric RMSE xc:#0000 xc:#FFF0 null: 56755 (0.866025) Dissimilarity-threshold If you get a 'too different' error, you can disable that using... -dissimilarity-threshold 1.0 But what is this threshold?詳細については、非常に古い生のテキストメモを参照してください... 画像比較、計算魔法の塔
部分画像と形状の照合


Using "compare -subimage-search" option...
magick compare -subimage-search large_image.png sub-image.png results-%d.png
This produces two images
results-0.png
which displays the matching location
results-1.png
which is a map of possible top-left corner locations showing how well
the sub-image matches at that location.
Note the second image is smaller, as it is only top-left corner locations.
As such its size is large_image - small_image + 1
The search however is based on a difference of color vectors, so produces
a very accurate color comparison.
The search basically does a compare of the small image at EVERY possible
location in the larger image. As such it is is slow! very very slow..
The best idea is to compare a very very SMALL sub-image to find possible
locations, than use that to then do a difference compare at each possible
location for a more accurate match.
Have a look at the script
https://imagemagick.dokyumento.jp/Usage/scripts/overlap
and associated discussion
Overlapped Images
Which looks at locating 'high entropy' sub-images of one image to search
for posible matches in a second image so the overlap offset between the
two images can be discovered, and the images merged into a larger image.
Another discussion uses sub-image searches to find tiling patterns in
larger images, with the goal of generating tilable images
Stitching image over a canvas
Example using RMSE and the new -grayscale function to merge the
separate color difference channel results into a final image
magick large_image.png small_image.png miff:- |
magick compare -metric RMSE -subimage-search - miff:- |
magick - -delete 0 -grayscale MS show:
Similarity Threshold
As many time people are only interested in the first match that matches.
As soon at this 'good' match is found, there is no need to continue
searching for another match. The -similarity-metric defines what you
would regard as a good match.
A "-similarity-threshold 0.0" will abort on the very first 'perfect' match
found, while "-similarity-threshold 1.0" (the default) will never match and
will search every posible point. A value between will set a color only
'fuzz' factor on what you would find an acceptable match.
Note that if the sub-image search is aborted, the second 'map' image will
only contain a partial result, only showing the results up until the comapre
aborted its search).
Some Basic Sub-Image Search Examples....
Grab a screen shot of a terminal window ("screen.png"),
and crop out an image of a single letter or word ("letter.png").
Just report first match.... for speed,
immeditally abort after finding that first match.
Don't bother outputing the incomplete image results.
magick compare -subimage-search -metric AE -similarity-threshold 1.0 \
screen.png letter.png null: 2>&1
NOTE speed will be highly dependant on where in the image that first
match is found.
Find all occurances of exactly that image,
as an image (white dots on matches, black elsewhere)
magick compare -subimage-search -metric AE \
screen.png letter.png miff:- 2>/dev/null |
magick - -delete 0 show:
Extract a list of the coordinates of all matching letters (white dots)
(as an enumerated pixel list, ignoring anything black)
magick compare -subimage-search -metric AE \
screen.png letter.png miff:- 2>/dev/null |
magick - -delete 0 txt:- | grep -v '#000000'
Just the coordinate list
magick compare -subimage-search -metric AE \
screen.png letter.png miff:- 2>/dev/null |
magick - -delete 0 txt:- | sed -n '/#FFFFFF/s/:.*//p'
NON-ImageMagick sub-image search solutions...
"visgrep" from the "xautomation" package.
This is much simpler sub-image search program, that only outputs a
list of coordinates for the matches (or even multiple sub-image matches).
Because it is so much simpler (for near exact matching) and not trying
to generate 'result images' for further study, it is also a LOT FASTER.
For example...
visgrep screen.png letter.png
Timed results
using "compare" to get just the first match 0.21 seconds
using "compare" to get a 'results image' 1.56 seconds
ditto, but extracting the coordinate list 1.76 seconds
using "visgrep" to get all matching coordinates 0.09 seconds
Other Methods of sub-image searching....
HitAndMiss Morphology
This is essentually a binary match, where you define what pixels much be
'background' and what must be forground. However it also allows you to
define areas where you don't care if the result is a foregorund or
background.
Basically a binary pattern search method.
Correlate (a Convolve variant)
This is similar to Hit and Miss but using greyscale values. Positive values
for forground and negative values for background, and zero for don't care.
It is however limited to grayscale images.
See Correlation and Shape Searching.
Both of these are basically just as slow as the previous sub-image compare,
but less accurate with regards to colors. However it's ability to specify
specify a shape (don't care areas) to the sub-image makes then useful as
a search method.
However you need to magick the sub-image into a 'kernel', or array of
floating point values, rather than as an actual image.
FFT Convolve (NCC)
Fast Fourier Transforms is a slow operator, but usually many orders of
magnitude faster than the previous two methods use. The reason is that
a convolution in the frequency domain is just a direct pixel by pixel
multiplication.
The 'Convolve' method, can be converted into a 'Correlate', simply by
rotating the sub-image being searched for by 180 degrees.
See Correlate.
Basically by converting images into the 'frequency' domain, you can do
a sub-image search, very very quickly, compared to the previous, especially
with larger sub-images that can be the same size as the original image!
This I believe has been added as a NCC compare metric.
Peak Finding and extracting (for near partial matches)...
Once you have compared the image you will typically have a 'probably map'
of some kind which defines how 'perfect' the match was.
What you want to do now is to find the best match, or perhaps multiple
matches in the image. That is, you want to locate the major 'peaks'
in the resulting map, and extract actual locations.
* Using a Laplacian Convolution Kernel
To get results you need to find the 'peaks' in the image, not
necessarily the brightest points either. You can get this by convolving
the image so as to subtract the average of the surrounding pixels from
the central pixel. As we only want positive results, a bias removes the
negative results.
magick mandril3_ncc1.png \
-bias -100% -convolve Laplacian:0 result.png
Thresholding and using it as a mask, and we can extract just those pixels.
magick mandril3_ncc1.png \
\( +clone -bias -100% -convolve Laplacian:0 -threshold 50% \) \
-compose multiply -composite \
txt:- | grep -v black
The problem is you can get a cluster of points at a peak, rather than
a definitive pixel, especially for two peak pixel surrounded by very low
values.
* Using a Peaks Hit and Miss Morphology Kernel
magick mandril3_ncc1.png \
-morphology HMT Peaks:1.5 result.png
The problem is that this may produce no result if you get two peak pixels
with exactly the same value (no gap between foreground and background)
However there are other 'peak' kernels that will still locate such a peak
cluster.
* Dilate and compare
Dilate (expand maximum values) the image 3 times then compare it to the
original image. Any peak within the area of dilated kernel size (7 pixel
square) will remain the same value. Set all pixels that show a
difference to pixels to zero.
Method by HugoRune (IM discussion topic 14491)
* Looped match and remove.
Basically find the highest pixel value, note it. Then mask all pixels in
an area around that peak, and repeat until some limit (number points or
threshold) is reached.
See a shell script implementation of this in Fred Weinhaus's script
"maxima
"
This does not look at finding the center of large 'cluster' of near equal
valued pixels, though this would be very rare in real images.
* Sub-pixel locating
If the peak is not an exact pixel, but could conceivably be a sub-pixel
location (between pixels) then some form of pattern match (gaussian curve
fit) in the area of the peak may let you locate the peak to a sub-pixel
coordinate.
This may be more important in image registration for parorama stitching,
especially when you are not using a large number points to get a best-fit
average of the perspective overlay.
* Finding a tile pattern in an image
When you have all the points, a search for a repeating pattern (similar
vector distances between multiple peaks) should point out some form of
tiling structure.
Improving the Sub-Image Matching...
The major problem with Correlate, (or the fast FFT correlate, which is the
same thing) is that it has absolutely no understanding of color.
Correlation (or convolve) is purely a mathematical technique that is used
against a set of values. With images that means it is only applied
against the individual channels of an image, and NOT with vector color
distances.
While compare actually does real comparing of color vectors. This will find
shapes better than correlate but is much much slower.
As such to make proper use of correlate you should magick your images
(before hand for speed, or afterward against results) to try and highlight
the color differences in the image as a greyscale 'correaltion' image.
ASIDE: Use -channel to limit operations to one greyscale channel will
improve speed. In IMv7 greyscaling will reduce images to one channel so
will gain speed improvements automatically.
For example instead of intensity, you may get a better foreground
/ background differentiation, by extracting the Hue of an image.
Though you may need to color rotate the hue's if there is a lot of red
in the sub-image being searched for.
See the examples of HSL and HSB, channel separation, to see this problem.
https://imagemagick.dokyumento.jp/Usage/color_basics/#separate
Another greyscaling method that should work very well is to do edge
detection on the two images. This will highlight the boundaries and shape,
which is typically much more important than any smooth gradient or color
changes in the image.
For examples of Edge detection methods see
https://imagemagick.dokyumento.jp/Usage/convolve/#edgedet
You may like to also look at directional or compass type edge detection.
Basically Anything that will enhance the shape for your specific case is
a good idea. Just apply it to BOTH images before correlating them.
Scale and Rotation Invariant Matching...
* position independence...
* matching rotated sub-image (angle independent)
* matching resized sub-images (size independent)
* Both size and angle independence
--------------
Other more specific image matching..
Matching Lines...
Hough Algorithm
Matching Circles...
Hough Algorithm Variant
Matching Faces
A combination of the above.
重複画像の検索
同一ファイル
ファイルがバイナリ的に同一であるか、つまり、それらがまったく同じファイルであり、おそらくお互いの正確なコピーであるか。ImageMagick は必要ありません。これを無視しないでください。この方法で非常に高速に多くのファイルを比較できます。私が見つけた最適な方法は、MD5 チェックサムを使用することです。
md5sum * | sort | awk {'print $2 " " $1'} | uniq -Df 1 |
IM画像署名
IMで各画像の「署名」を生成できます...
magick identify -quiet -format "%#" images... |
直接比較
2つの画像が同じサイズの場合、「magick compare
」プログラムを使用して直接比較し、どの程度一致するかを確認できます(上記参照)。これは非常に遅く、私の経験では、フルサイズの画像に対して使用すると非常に遅いため、あまり役に立ちません。ただし、2つの画像がどれほど類似しているかを把握する最良の方法である可能性があります。画像分類
画像を比較する試みの中で、色付き、漫画のような、およびスケッチはすべて、互いに非常に異なる比較になることがわかりました。特に線画やグレースケール画像は、カラー画像よりも差が小さくなる傾向があり、ほぼすべての比較方法でそうでした。基本的に、色がすべて直線上に並んでいるため、任意の色メトリクスは、このような画像を3倍近くに配置する傾向があります(3次元カラースペースに対する1次元カラースペース)。基本的にこれは、画像を少なくともこれらの2つのグループに分離することが、重複または非常に類似した画像を検索するための本格的な試みにおける非常に重要な最初のステップになる可能性があることを意味します。他の主要な分類または画像タイプも、比較対象の画像の数を減らすだけで、画像の比較を容易にすることができます。下記の画像分類を参照してください。サムネイル比較
重複を探すために、直接比較によって比較する画像の小さなサムネイル(たとえば64x64ピクセル)を(メモリ内に)大量に作成するプログラムがあります。これは一般的に人々(私自身を含む)が最初に試みることです。実際、これはほとんどの画像比較プログラム(写真処理ソフトウェアなど)が行う手法です。実際、これはうまく機能し、完全に一致する画像を見つけることができます。また、少しぼかしを加え、差異のしきい値を緩めることで、わずかにトリミングおよびサイズ変更された画像も見つけることができます。ただし、10,000個のそのようなサムネイルをメモリに保存しようとすると、通常のコンピュータがスラッシングを開始し、非常に遅くなることがよくあります。あるいは、これらのすべてのサムネイルを保存すると(プログラムがユーザー表示のためにこれを行う場合を除き)、多くのディスク領域が使用されます。ディスクスラッシングの問題を改善する1つの方法は、メモリ内の画像の数を少なくすることです。つまり、1つの画像を他のすべての画像と比較するのではなく、グループ単位で画像を比較することです。自然なグループ化はディレクトリ別であり、画像の各ディレクトリを他の画像のディレクトリと比較することです。実際、画像はグループ化される傾向があるため、これは非常に優れており、この画像のグループはしばしば同様のグループと一致します。したがって、一致する画像をディレクトリペアごとに出力することはボーナスです。また、2つの画像がどの程度類似しているかは、その画像タイプによって異なります。2つの線画を比較する場合は、異なる画像を割り引くために非常に小さい「しきい値」が必要ですが、広い色領域を持つ画像を比較する場合は、トリミングされた類似画像をキャッチするために、より大きなしきい値が必要になることがよくあります。現実世界の画像には、テクスチャがわずかなオフセットを持つ画像間で非常に深刻な加法的な違いを生み出す可能性があるという、より大きな問題があります。このため、メディアンフィルター、ぼかし、色数の削減、または色セグメンテーションを使用することにより、これらの画像を一般的な色領域に単純化する必要がある場合があります。このような処理の後、現実世界の画像は、一般的に漫画と同様の方法で比較できます。画像メトリクス
各画像の小さなメトリクスを作成することは、線形順序(O)演算です。一方、すべての画像を他のすべての画像と比較することは、2乗順序(O^2)演算です。メトリクスは、実際には一致する画像を見つけるためのものではなく、より小さなグループでより集中的な比較を実行できるように、類似した(一致する可能性の高い)画像をグループ化するためのものです。したがって、メトリクスの比較は寛大である必要があり、一致する確率が低い(それでも確率がある)画像を受け入れる必要があります。しかし、あまりにも寛大で、あまりにも多くのミスマッチを含めるべきではありません。また、いくつかのメトリクスが、別のメトリクスが隣接する異なる領域(しきい値のミスマッチ)に分類されるため、「ちょうど見逃す」可能性がある画像を一致させる可能性があるため、複数のメトリクスを検討することもできます。次のセクション(メトリクス)では、私が実験した、または理論化した、IMで生成されたさまざまなメトリクスについて説明します。平均色、優勢色、前景背景、エッジ色、色のマトリックスなどが含まれます。Günter Bachelierは、画像比較のために、フーリエ記述子、フラクタル次元、凸領域、長軸/短軸の長さと角度、丸み、凸性、カール、立体度、形状の分散、方向、オイラー数、境界記述子、曲率、曲げエネルギー、絶対曲率合計、面積、幾何学的重心、重心、コンパクトさ、偏心率、重心に関するモーメントなどのよりエキゾチックなメトリクスを使用する可能性も報告しています。私の現在の取り組みは、画像の平均色の単純な3x3マトリックスを生成して使用し、画像を表現することです(下記の色マトリックスメトリクスを参照)。これらが生成(または要求)されると、メトリクスは(他のファイル情報とともに)各ディレクトリ内の特別なファイルにキャッシュされます。これにより、キャッシュされたメトリクスがない場合、または画像が変更された場合にのみ、特定のメトリクスを再生成する必要があります。類似度または距離
2つの画像のメトリクス(または実際の画像)は、一般的に単一の距離測定または「類似度メトリクス」を生成する、さまざまな方法を使用して比較できます。これにより、「類似」した画像をまとめてクラスタリングするために使用できます。- 直接しきい値、または最大差(チェビシェフ距離)
1つのメトリクスで最大の差がある画像を比較します。
しきい値は、多次元メトリクス空間で類似した画像の超立方体を生成します。もちろん、画像の違いは1つのメトリクスのみに基づいており、すべてのメトリクスには基づいていません。 - 平均差(平均距離、平均マンハッタン距離)
すべての差を合計し、オプションでメトリクスの数で除算します。
これは、都市グリッドを移動するために必要な距離に相当するため、2つのメトリクス間のマンハッタン距離としても知られています。すべてのメトリクスが等しく寄与するため、予想よりも「近い」ものに見えます。空間では、このメトリクスのしきい値はダイヤモンドのような形状になります。 - ユークリッド(ピタゴラス)距離
または、メトリクス空間におけるメトリクス間の直接的なベクトルの距離。
より多くのメトリクスが関与すると、値は大きくなる傾向があります。ただし、1つのメトリクスが大きな差を生み出すと、他のメトリクスよりも寄与が大きくなる傾向があります。しきい値は、メトリクス空間に球形のボリュームを生成します。 - 数学的誤差/データフィットまたは(慣性モーメント???)
すべての差の二乗の合計を求め、平方根を取得します。
これは、数学的な曲線が特定のデータセットにどれだけ近いかを計算するためによく使用されますが、画像メトリクスを比較するためにも使用できます。
これは、最適な非ベクトル距離測定を提供するようです。 - ベクトル角度
画像のメトリクスによって作成されたベクトル空間の中心からの2つの線の間の角度を見つけます。これにより、2つの画像に適用された可能性があるコントラストや画像強調の効果が除去されるはずです。
まだテストされていません - ベクトル距離
メトリクスのすべての個々のカラーベクトルが同じ方向にある線画またはグレースケール画像の場合、画像の平均色からのメトリクスの相対距離がおそらくより重要です。最大距離に対する距離を正規化すると、コントラストの影響が軽減される可能性があります。
つまり、これは線画画像の比較方法です。
まだテストされていません - クラスタ分析
すべてのメトリクスがプロットされ、多次元空間内の類似したクラスターにグループ化されます。優れたクラスタリングパッケージでは、クラスタリングを生成しないメトリクスを発見して除外することもできる場合があります。
まだテストされていません
人間の検証
コンピュータが一致する画像を見つけようとした後、実際に画像が一致することを検証するのはユーザー次第です。一致をユーザーに提示することも難しいタスクとなる可能性があります。ユーザーは、おそらく次の機能が必要となるためです...- 画像を並べて表示する
- 元のサイズで、オプションで共通の「スケーリングされた」サイズで、2つの画像を非常に高速に切り替える。
- 画像を一致させようとするために、異なるスケールで変換された画像を切り替えたり、重ねたりする。
- 一致する画像と同じディレクトリ(ソース)またはおそらく同じクラスター(他の近接一致)内の他の画像を見て、各画像を個別に処理するのではなく、グループ全体を処理する。
- 画像を並べ替えたり、他の画像を拒否したりするために、2つ(またはそれ以上)のディレクトリ間で、画像のファイル名の変更、移動、置換、削除、コピーを行う。
- など...
magick display
」および「magick montage
」と、画像ビューア「XV
」および「GQview
」が含まれます。ただし、2つ以上のディレクトリを同時に開き、複数のディレクトリからのコレクションまたは画像グループを表示できる他のプログラムの提案も受け付けています。他のプログラムまたはスクリプトによるリモートまたは制御は、画像グループをセットアップして、ユーザーが閲覧および処理するのに最適な方法で提示できるようにするため、非常に重要です。私のニーズを満たすプログラムはまだありません。たとえば、「gqview
」にはコレクションと単一のディレクトリビューがありますが、複数のディレクトリビューや、プレゼンテーションのリモート/コマンドライン制御は許可されていません。ただし、コレクションは各画像がどのディレクトリからのものかを示しておらず、単一のディレクトリビューを他のディレクトリに切り替えません。また、リモートプログラム制御もありません。一方、非常に古い「xv
」では、複数のディレクトリビュー(複数の「ビジュアルシュナウザー」ウィンドウを使用)と、コントロールウィンドウ内のコレクションリストが許可されていますが、一度に表示できる画像は1つのみで、コマンドラインから開いて配置できるディレクトリは1つのみです。もちろん、リモートコントロールもありません。これらは私が見つけた中で最高の人間検証プログラムであり、各画像グループ、一致するペア、またはすべてのグループ一致画像に対して、セットアップして起動するスクリプトを使用しています。しかし、どれもあまり満足のいくものではありません。ライトテーブルと関連ソフトウェアが画像を整理するのに適した方法であるように思えますが、そのためにはより大きなタッチセンシティブスクリーンが必要であり、そこに大きな費用がかかります。クロスタイプ画像比較
私がやりたいことの一つに、ある画像から作成された画像を見つけるという、より難しいものがあります。例えば、誰かが線画に色を塗ったり、絵を描いて漫画や超リアルな画像を生成した場合、それらを照合したいのです。背景が追加されている場合もあります。これらは非常に難しく、エッジ検出技術を用いた私の実験は今のところ結論が出ていません。この中で適切な指標を見つけることが鍵となります。人間は「類似性」の関連付けをはるかにうまく行えますが、それでもユーザーに提示するための可能性のある一致を見つける必要があります。重複画像を見つけるためのまとめ
要約すると、重複画像を見つけて処理するための現在の手順は、「類似した」画像を見つけて選別するためのプログラムのパイプラインです。Generate/Cache Image Types and Metrics -> Compare metrics and cluster images. -> compare images in cluster for matches -> group into sets of matching images (by source directory) -> human verificationご覧のとおり、私は高度に段階的なアプローチを模索しています。アイデアがあればメールしてください!!!
タイプ別の画像ソート
画像の種類を判別することは重要です。ほとんどの画像比較方法は、特定の種類の画像でのみ機能するためです。例えば、テキストの画像とアーティストのスケッチを比較しても意味がありません。また、ほぼ純粋な白色(スケッチ)の画像にカラー画像比較方法を使用しても役に立ちません。通常、画像を比較する際に最初に行うことは、画像が使用している画像の種類、または「カラースペース」を判別することです。画像の基本的な分類には、次のようなものがあります。- 白黒の線画またはテキスト画像(ほぼ全てが単色)
- 2つの基本色で構成される画像 - 同じくらい(パターン画像?)
- グレースケールのアーティストの描画(多くの陰影がある)
- 線形カラー画像(色はグラデーションを形成しますが、白黒からはではありません)
- 大きな単色領域のある漫画のようなカラー画像
- 陰影のある色の領域のある実写画像
- 画像には、注釈付きのテキストまたはロゴオーバーレイが含まれています。(単色のスパイク)
- 画像全体の平均色
- 画像内の主要な色
- 画像の前景/背景色。
グレースケール画像
画像がグレースケールかどうかを確認する最も簡単な方法は、画像の彩度レベルを見ることです。つまり、画像を「色相」画像カラースペースに変換し、色(通常は緑色)チャネルの平均値と最大値を取得することで簡単に行えます。例えば、数値は0〜1の範囲に正規化されています。ご覧のとおり、「バラ」は非常にカラフル(平均30%)で、強いピーク(1に近い)があります。しかし、「花崗岩」画像は非常に低い彩度(約2%)と低いピーク値を持っています。純粋なグレースケールではありませんが、非常に近いものです。平均値が低く、ピークが高い場合は、強い色の小さなパッチを示します。同じチャネルを閾値処理すると、画像のカラフルな領域のマスクを生成できます。問題点:上記では、色が線形である画像は見つかりません。つまり、黄色がかった(セピア調)写真や青写真など、線形カラーグラデーションを形成する色のみを含む画像です。これらは本質的にカラフルなグレースケール画像です。次の画像タイプを参照してください。画像は線形カラーですか
別の手法は、画像内のすべての色(または簡略化されたメトリックのカラーマトリックス)に対して、3次元線の直接的な「最適適合」を実行することです。適合の誤差(一般的には誤差の二乗の平均)は、画像がその線にどれだけ適合しているかについて非常に優れた指標となります。3次元画像への線の適合には、一般的にいくつかのベクトル数学が含まれます。結果は、画像が「線形」に近い色のセットを使用しているかどうかを知らせるだけでなく、明暗だけでなく、黄色の紙の上のオフグレーの線など、色の任意のスケールに対して機能します。また、この結果を使用して、画像をより単純な「グレースケール」画像に変換したり、(または、カラーメトリックのセットをグレースケールメトリックに変換するだけ)して、より単純な比較や、より良い一致を見つけることもできます。私の試用テストプログラムでは、この判別を行うために画像全体を使用することさえなく、画像の表現に9色(27値)の単純なカラーマトリックスメトリックを使用しています。ただし、このテストは一般的に、陰影のない線画をあまりうまく区別しないことに注意してください。そのような画像は、ほとんどが単一の背景色(通常は白)であり、そのように色の線形グラデーションを示さない場合があります。それらは、別のテストを使用して最初に分離する必要があります(次は、実際にははるかに簡単です)。興味があればメールしてください。そして、あなたが試したことを教えてください。純粋な白黒画像
画像が色やグレー(アンチエイリアシングによる)がほとんどない、ほぼ純粋な白黒画像であるかどうかを確認するために、"-solarize
"オプション(Solarizeに関するIMの例を参照)を斬新に使用できます。この操作を任意の画像に適用すると、明るい色は暗い色(否定される)になります。そのため、ほぼ白の色はほぼ黒の色になります。そのような画像から、画像の簡単な統計分析により、画像が純粋に(またはほぼ純粋に)白黒であるかどうかを判別できます。
magick wmark_dragon.jpg -solarize 50% -colorspace Gray wmark_bw_test.png magick identify -verbose -alpha off wmark_bw_test.png | \ sed -n '/Histogram/q; /Colormap/q; /statistics:/,$ p' > wmark_stats.txt |
![]() ![]() ![]() ![]() |
|
0
')に非常に近く、「標準偏差」も非常に小さいですが、「平均」よりも大きいことがわかります。したがって、この画像は、ほとんどが純粋な白黒で、色や中間調のグレーはほとんどないはずです。一般的なグレースケール画像とカラー画像の場合、「平均」ははるかに大きく、一般的に「標準偏差」は平均よりも小さくなります。それが起こる場合、ソラライズされた画像には純粋な黒がほとんどないことを意味します。つまり、純粋な黒または白の色がほとんど存在しません。組み込みの花崗岩画像を使用して、このテストを繰り返しましょう。
magick granite: granite.jpg magick granite.jpg -solarize 50% -colorspace Gray granite_bw_test.png magick identify -verbose -alpha off granite_bw_test.png | \ sed -n '/Histogram/q; /Colormap/q; /statistics:/,$ p' > granite_stats.txt |
![]() ![]() ![]() ![]() |
|
スポットカラー画像
これらの画像は上記のグレースケールテストに失敗しますが、まだ白黒ですが、小さな領域または色のあるパッチがあります。小さな色のパッチは、大きな画像の全体的な平均に簡単に埋もれてしまい、グレースケールとして誤ってタイプされる可能性があります。ビットエラーである可能性が高い、または画像全体に散らばっているような単一の色のピクセルだけの画像には関心がありません。しかし、色の矢印や小さな色のオブジェクトを含む画像を例にとってみましょう。言い換えれば、濃縮された色のスポットです。IMフォーラムの議論では、 「彩度テスト」を使用したグレースケール画像の誤検出画像がより小さなセクションに分割され、それらのいずれかの領域で高い彩度を探すことが考えられていました。これにより、次の方法につながりました。- 彩度または彩度チャネルを持つカラースペースに画像を変換する
- 画像を1:50(2%)の比率で小さくサイズ変更する(例:色の「スポットサイズ」)
- 最大彩度/彩度値で閾値処理する
中間調カラー画像
![[IM Output]](../images/midtone_image.jpg)
テキスト vs 線画
もし、ほとんど単色(通常は白)の画像がある場合、その画像の内容がテキストか線画のどちらかに分類できるか試すことができます。テキストは、一般的に水平線にグループ化された、小さく分断されたオブジェクトが多く含まれます。一方、線画は、ほとんどすべてが全体としてつながっており、さまざまな角度を含んでいるはずです。漫画のようなカラー画像も、画像比較を簡単にするために線画に変換できるため、線画比較の方法があると便利でしょう。どなたか?テキストの詳細については、IMフォーラムでいくつかのテクニックが議論されています。画像にテキストが含まれているか確認を参照してください。実写風 vs 漫画風
基本的に漫画は、明確な境界線を持つ非常に特定の色のブロックを持ち、多くの場合、分離する黒線を使用することでよりシャープになっています。また、通常、グラデーションや陰影効果は最小限です。一方、実写画像は、ソフトなエッジ効果、色のグラデーション、テクスチャが多数あり、さまざまな色を使用します。もちろん、これは常に当てはまるわけではありません。実写画像でも、特にコントラストが非常に高い場合、漫画のような品質を持っている可能性があります。また、最近の漫画は非常に写実的であるため、漫画として分類するのが難しい場合があります。一般的に、実写画像と漫画の主な違いは、テクスチャとグラデーションです。したがって、どのような種類の画像であるかを判断するには、画像を、細かいスケールのテクスチャを除去した同じ画像と比較する必要があります。大きな違いがあるということは、その画像が「漫画風」や「平面的」ではなく、「現実的」で「実世界」に近いことを意味します。また、線画、アーティストのスケッチ、テキストもスタイル的には漫画風である可能性がありますが、非常に細かいテクスチャとディテールを持っているため、上記の方法では画像を実世界のものと見なしてしまう可能性があります。したがって、線画とスケッチは事前に分離する必要があります。Jim Van Zandtは、この解決策を提供しています...
- すべてのピクセルの色を書き出す
- 色でソートする
- 色ごとのピクセル数を書き出す
- ピクセル数でソートする
- 画像内のピクセルの半分を占めるまで、リストを順に処理する。
- #ピクセル >>> #色 の場合、漫画風です。
histogram:
」の例を参照してください。もし、何らかの画像分類スキームを作成した場合... たとえそれが大まかなものであっても、結果を教えてください。他の人(私自身を含む)が恩恵を受けることができます。
特定の画像タイプの処理
より具体的な画像判別テクニックに関するメモと情報です。不良なスキャンまたは印刷物
現実世界では、物事は決して完璧には機能しません。スキャナーはセンサーが壊れており、プリンターのドラムには傷があります。これらの問題は、通常、スキャンや印刷物に長い垂直線が生じます。画像にこれらの垂直線があるかどうかを判断するのは比較的簡単です。アイデアは、画像内のすべての行のピクセルを平均することです。あらゆる「欠陥」は、ピクセル行の「しきい値ヒストグラム」を使用してカウントできる最終的なピクセル行に、鋭い突起として現れます。FUTURE -- image example needed for testing magick bad_printout.png -crop 0x1+0+0 -evaluate-sequence mean \ -threshold 50% -format %c histogram:info:- faster method but needs image height (assumed to be 1024) magick bad_printout.png -scale 1024x1 \ -threshold 50% -format %c histogram:info:-ファックス、印刷物、またはスキャンからこのような「不良線」を特定して削除したら、この種の実世界の欠陥を気にすることなく、他のテストを続行できます。
空白のファックス
まず、ファックスがページに追加した可能性のあるヘッダーとフッターを「-shave
」で取り除く必要があります。その後、「しきい値ヒストグラム」(上記参照)を実行して、個々の黒いピクセルがいくつあるかを確認できます。FUTURE -- image example needed for testing magick blank_fax.png -threshold 50% -format %c histogram:info:-または、ノイズトリムを実行して、画像に実際に注目に値するより大きな領域やオブジェクトが含まれているかどうかを確認できます。
FUTURE -- image example needed for testing
スパム画像
スパム画像は、通常、画像のカラーヒストグラムに顕著な純粋な色のスパイクを示します。画像の色を調べると、通常、画像の隅の1つにあります。ただし、これは漫画のような画像では機能しません。電子メールスパム画像
これらは、さまざまなスパムフィルターを回避するように設計された画像です。基本的に、広告のテキストは、さまざまな色と、検出を困難にするために追加された余分な「汚れ」やその他のノイズを使用して画像に隠されています。そして、これらは企業の電子メールヘッダーのロゴなどと区別するのが難しいですが、通常、典型的な電子メールロゴよりもはるかに大きいです。1つの検出手法は、画像に大きなメディアンフィルターを使用することです。電子メールスパムテキストは通常消えますが、ロゴや画像は依然として非常にカラフルなままです。画像メトリクス、比較する画像をすばやく見つける
メトリクスは、非常に少ないメモリで画像を表現するための「指紋」の一種を表します。類似の画像は、類似のメトリクスをもたらすはずです。ただし、メトリクスは実際に一致する画像を見つけるように設計されているのではなく、間違いなく一致しない画像を無視するように設計されていることに注意してください。つまり、優れたメトリクスを使用すると、さらなる比較からほとんどの画像を無視できるため、すべての画像を検索するのに必要な時間を短縮できます。画像の平均色
You can use -scale to get an average color of an image, however I also suggest you remove the outside borders of the image to reduce the effect of any 'fluff' that may have been added around the image. magick image.png -gravity center -crop 70x70%+0+0 \ -scale 1x1\! -depth 8 txt:- Alternatively to get 'weighted centroid' color, based on color clustering, rather than an average, you can use -colors magick rose: -colors 1 -crop 1x1+0+0 -depth 8 -format '%[pixel:s]' info:- rgb(146,89,80)これは一般的に、サイズ変更、軽いトリミング、回転、または平行移動された画像に一致します。ただし、密接な関係がない多くの画像にも一致します。最大の問題は、このメトリクスでは、明るくしたり、暗くしたり、画像の全体的な色相を変更したりした画像が一般的に無視されることです。また、色と実世界の画像には優れたメトリクスですが、グレースケール画像にはまったく役に立ちません。そのような画像はすべて、タイプ内のさらなるクラスタリングなしに一般的にまとめられます。これは、画像タイプの初期分類が優れた画像のソートとマッチングに不可欠である理由を示しています。
画像の主な色
画像の主な色は少し異なります。背景色と前景色をマージする平均色の代わりに、最も一般的な前景色、およびおそらくその主な色で画像が構成されている割合を把握する必要があります。したがって、画像のヒストグラムを取得するだけでは、画像が特定の色ではなく、多数の個々の色の色合いを使用している可能性があるため、不十分です。これは、低レベルの量子化関数である -segment を使用し、その後ヒストグラムを取得することで実行できます。これは、色の距離が離れた(色的に)色のクラスターをマージしようとしないため、-colors を直接使用するよりも利点がありますが、結果の判定が難しい場合があります。FUTURE exampleその後、ヒストグラムは各主な色の量を示します。ただし、通常、漫画や線画の主な色は、画像の背景色です。したがって、実写画像にのみ役立ちます。一方、画像の平均境界色と比較することで、画像に真の背景があるかどうかを検出できる場合があります。画像の主な色は、関心のあるオブジェクトではなく、画像の背景色の影響をより強く受ける可能性が高いことに注意してください。つまり、通常、画像の中心付近にあります。
境界色
画像の4つのエッジ(最大2〜3ピクセル)を繰り返し切り取り、境界の平均色を計算することで、画像がフレーム化されているかどうか、およびその深さを判断できます。画像に明確な背景があるかどうか。または、画像全体に空/土地またはクローズアップ/遠くの色分離があるかどうか。平均化されたサイドカラーを画像の平均中心色と比較することで、空の風景の写真など、中心的なテーマや被写体のない画像が均一かどうかを検出できます。ヒストグラム - 一般的な色のマッチング
画像に見られる色のタイプに関するメトリクスについては、何らかの種類のヒストグラムが使用されます。これは、「カラービン」の配列を作成し、色が見つかるたびに各「ビン」のカウントを増やすことで行われます。すべての画像に対して大きなヒストグラムを保存することはできないと思います。したがって、ヒストグラムに最も顕著な色のみを保存するか、より少ない数のビン(各ビンにより多くのピクセルがある)を使用します。「カラービン」の通常のヒストグラムは、実際にはあまりうまく機能しません。その理由は、各色が常に1つのビンに分類されるためです。つまり、各ピクセルは、その色がビンの端にどれだけ近いかに関係なく、すべての基準で各ビンに追加されます。これにより、適切なメトリクスは生成されません。1つの解決策は、重複するビンを持つヒストグラムを作成することです。つまり、すべての色(黒または白を除く)は、2つのカラービンに分類されます。その後、画像を比較するときに、近い色が少なくともそれらのビンの1つと一致します。もう1つの方法は、各色がビンの中心にどれだけ近いかに応じて、各「ビン」に寄与させることでヒストグラムを作成することです。つまり、1つのビンの端にある色は、実際には2つのビンに分散されます。これにより、一種のファジーな、または補間されたヒストグラムが生成されますが、特に非常に少ない数のカラー「ビン」が使用される場合は、画像をより正確に表現するものです。また、ヒストグラムは伝統的に、画像のグレースケール成分のみであるか、3つの別々のRGB成分のいずれかです。しかし、これはあまり良い表現ではありません。代わりに、画像をより適切に表現するために、色相、彩度、輝度ヒストグラムを試すことができます。または、なぜ1次元ヒストグラムに限定するのでしょうか。色空間全体で一連の実際の色に色をマッピングするのはどうですか?つまり、「赤」の値だけをビン化するのではなく、3次元カラービン(適切な色空間)でそれを数えるのはどうですか。これにより、画像内で見つかった色を真に表すヒストグラムが生成されます。このような3次元ヒストグラムメトリクスは、たとえば8x8x8または2048のビンで構成される単純な配列にすることができます。つまり、2Kバイトのメトリクスです。次に、カラー検索は、適切な数の近いビンを特定し、近いビンの補間されたカウントを取得します。これは、画像内のその色に「近い」色の数を表します!前景/背景色の分離
-colors を使用して、画像をわずか2色に減らすことで、画像を前景と背景の部分に分離しようとすることができます。最初に -median フィルターを使用すると、画像内の細かいディテール、線のエッジ、ノイズの影響を削除できます。もちろん、これはほとんどが白いスケッチのような画像にはあまり適していません。magick rose: -median 5 +dither -colors 2 \ -depth 8 -format %c histogram:info:-これは、画像内で赤とグレーが主な色として表示されていることを示しています。画像の中心をトリミング/クロップすることで、前景と背景を決定する必要があります。
magick rose: -median 5 +dither -colors 2 \ -trim +repage -gravity center -crop 50% \ -depth 8 -format %c histogram:info:-これは、赤色の「バラ」の色が主な前景の色であることを示しています。風景画像では、下地の地面の色と上空の空の色のように、異なる分離になる場合があることに注意してください。したがって、色の分離方法を大まかに見ることが、画像タイプの決定に非常に役立つ可能性があります。また、「スパム」のようなテキストを含む画像では、画像の他の部分よりもはるかに目立つ色の塊が一方の隅に表示されることがよくあります。見つかった場合は、3色で再処理し、最も一般的な「背景」の色でその領域を消去してから、最終テストを行います。このテクニックは、「肌の色」「緑」「風景」などのクラスに画像を分離するのに適した方法であると考えられます。
平均カラーマトリックス
3x3のマトリックスカラースキーム(「-scale 3x3\!
」)は、妥当なカラー分類スキームです。これにより、類似した画像が非常によく分離され、グループ化されます。たとえば、スケッチ(ほぼすべて白)、グレースケール、風景、海景、部屋、顔などは、すべて基本的で類似したグループに分離されます(理論的には)。これは、フォトモザイクを生成するために画像をインデックス化するのに使用する妥当な指標でもあります。NetPBM画像形式の出力は、テキスト数値としてピクセル値のみを出力できるため、このような指標の生成に特に適しています。これは27次元の結果(3値の3x3色)を生成するため、多次元クラスタリングアルゴリズムが必要になる場合があることに注意してください。優れた3Dクラスタリングプログラム/アルゴリズムをご存じですか? たとえば、以下はIMロゴの3x3 RGBカラー(深さ8)です。magick logo: -scale 3x3\! -compress none -depth 8 ppm:- |\ sed '/^#/d' | tail -n +4 251 241 240 245 234 231 229 233 236 254 254 254 192 196 204 231 231 231 255 255 255 211 221 231 188 196 210上記は、16ビット値を使用し、ロゴや追加された可能性があるフレームの不要な部分を削除するために、境界線の10%をトリミングすることで改善できます...
magick logo: -gravity center -crop 80% -scale 3x3\! \ -compress none -depth 16 ppm:- | sed '/^#/d' | tail -n +4 63999 59442 58776 62326 58785 58178 51740 54203 54965 65277 65262 65166 45674 47023 49782 56375 55648 55601 65535 65535 65535 52406 55842 58941 44635 48423 52881もちろん、以前の平均カラー指標と同様に、色相や明るさの変化など、色を変更した画像とのマッチングにも問題が発生します。(次のセクションを参照)また、この指標は、グループ内で線画を分離できますが、非常に一般的な方法でのみです。このような描画は、コンテンツよりも背景の「紙」の色によってグループ化されることが多く、カラー画像よりも一般的に類似性の「しきい値」が小さくする必要があります。
色差マトリックス
色を直接指標として使用することの最大の問題は、画像を特定の一般的な色に関連付けることです。つまり、明るくしたり暗くしたり、色相を変更したりした画像は、グループ化されません。この解決策の1つは、画像の主な色または平均色を指標から何らかの方法で減算することで、色のマトリックスを使用するとこれが可能になります。たとえば、ここでは、マトリックス内の周囲のすべての色から中央または中心の平均色を減算します。magick logo: -gravity center -crop 80% -scale 3x3\! -fx '.5+u-p{1,1}' \ -compress none -depth 16 ppm:- | sed '/^#/d' | tail -n +4 51093 45187 41761 49419 44529 41163 38834 39947 37950 52371 51007 48152 32767 32767 32767 43469 41393 38587 52629 51279 48521 39500 41587 41926 31729 34168 35867画像に負の色の値を保存できないため、差に0.5を加算することに注意してください。また、処理されるピクセルは9つだけなので、低速の「
-fx
」演算子の使用は許容されます。中央のピクセル(上記の2行目の先頭の「32767 32767 32767」)はあまり変化せず(変化はわずかな丸め誤差によるもののみ)、結果から削除して、指標を24次元(値)に減らすことができます。あるいは、画像の平均色を9つのすべての色の値から減算することもできます。magick logo: -scale 3x3\! \( +clone -scale 1x1 \) -fx '.5+u-v.p{0,0}' \ -compress none ppm:- | sed '/^#/d' | tail -n +4 38604 35917 34642 37011 33949 32441 32839 33841 33649 39447 39259 38369 23358 24377 25436 33538 33174 32426 39612 39434 38605 28225 30576 32319 22271 24381 27021これは、指標ジェネレーターではなく、指標比較器によっても実行できます。指標は、一般的な色や明るさの変化に関係なく、類似した画像を非常に近い位置に配置し、カラー画像を非常によく分離およびクラスタリングします。ただし、コントラストの変化には依然として敏感です。この指標の変更は、比較プロセス中に行うことができるため、未加工のカラーマトリックス指標を、収集、キャッシュ、比較する標準の画像指標として引き続き使用できます。これが、私が現在、大規模な画像比較のために行っていることです。ストレートな色の平均とは異なり、この指標を使用して、異なる線画画像を区別できます。ただし、線画は線形カラースケールを使用しているため(すべての色が指標空間で直線上に並んでいる)、画像間の差はカラー画像の約1/3です。したがって、線画を比較する場合は、非常に異なるしきい値が必要です。したがって、線画やグレースケール画像をカラー画像から分離する方が良いでしょう。つまり、これは私がこれまでに見つけたカラー画像に最適な指標の1つです。線画である画像を最初に特定し、はるかに低いしきい値を使用して個別に比較するようにしてください。幸いなことに、指標自体を使用して、画像をグレースケールまたは線形カラー画像に分離できます。ご提案をお待ちしております。
近傍の差
上記は、中央のピクセルが減算され、すべての値が完全なグレーにオフセットされた3x3マトリックスを生成します。ただし、より良い方法は、個々のセルの色を保存しようとする代わりに、各セルとその隣接セル(8つの隣接セル)の間の差を生成することです。つまり、左上隅の色を保存するのではなく、その隅と上中、中央、および左中の間の差を保存します。もちろん、小さい3x3配列でも、12個の差を含む署名が得られますが、完全な差をエンコードする必要はなく、一般的な差のレベルだけです。たとえば、等しい、または大小の正/負の差の値などです。これは、実際の色が署名にまったく影響しないため、まったく異なる色が含まれている画像間でも一致する画像を検出できる可能性がはるかに高くなります。'libpuzzle'画像比較ライブラリはまさにそれを行っていますが、各セルの中心ピクセルのみが平均化された9x9マトリックスを使用しています。また、グレースケールバージョンの画像に限定されています。このテクニックは、ポストスクリプトペーパーであるあらゆる種類の画像に対する画像署名で完全に定義されています。この論文では、署名をデータベースに保存する方法と、類似(必ずしも同じではない)署名を持つ画像を見つけるためのルックアップを実際に行う方法についても詳しく説明しています。これは、私が実際にこれを行う方法を詳細に説明した最初の論文です。 :-)知覚ハッシュ
画像を8x8に縮小し、平均強度を計算します。64ビットハッシュの各ビットは、ピクセルが平均より上にある場合は1、平均より小さい場合は0です。2つの画像間の類似性を比較するには、ビット単位でビット単位でハッシュを比較し、ハミング距離を返します。ハミング距離が近いほど、画像はより類似しています。21/64を超えるものは類似していないと見なされます。pHashは、YCbCrエンコーディングを使用しているようです。JPEGからのDCTを直接使用することや、大きさ/位相をログ極座標系にマッピングすることが最も有望な方法であるという話もあります。より良い画像のマッチング
より正確な画像マッチングのために、より大きな画像を比較する場合に、私が試したことがないか、あまりうまく機能しなかったその他のメモとテクニック。セグメンテーションカラー
上記で示したように、上記の指標の多くは、画像をより適切に分類できるように簡略化するための基本的な試みとして、ぼかし/中央値フィルターとそれに続く色の削減手法を使用しています。ただし、カラー量子化演算子は、この目的のために設計されたものではありません。その役割は、画像の重要な詳細を強調するために色を減らすことです。しかし、画像比較では、これらの機能を強調するのではなく、比較対象となる領域を強調する必要があります。これは、セグメンテーションとして知られる関連するカラーテクニックの役割です... 補足:Leptonicaから:画像セグメンテーションは、異なるプロパティを持つ領域への画像の分割です。この演算子は、同様の色の領域をブロックアウトし、それらの領域から詳細を削除します。次に、2つの画像を比較すると、画像内の低レベルの詳細ではなく、領域を比較しています。IMは、セグメンテーションアルゴリズム「-segment
」を実装しています。その実装の詳細については、SegmentImage()を参照してください。例magick logo: -median 10 -segment 1x1 \ +dither -scale 100x100\! segment_image.gif-segmentの1つの問題は、非常に遅く、大きな画像に対してのみ機能するように見えることです。小さな画像(バラ:または100x100スケールのロゴなど)では、単一の色しか生成されないようです。これはバグである可能性があります。もちろん、上記で行ったように、セグメント化後に画像を拡大縮小することもできます。このようにして、メモリに多数の画像を保存して、互いに比較することができます。また、Leptonicaが提供する画像セグメンテーションアルゴリズムと比較した場合、得られたセグメンテーションはあまりうまく機能しないようです。Leptonica:カラーセグメンテーションを参照してください。ただし、IMセグメンテーションの代わりに、カラー量子化関数を誤用して、同様の色の領域を見つけることができます。例
magick logo: -scale 100x100\! -median 3 \ -quantize YIQ +dither -colors 3 segment_image.gif欠点は、-colorが画像に存在する可能性のある色の領域の数を制限することですが、segmentは、画像に実際に存在する領域の数に関係なく、同様の領域を保持しようとすることです(少なくともそうすべきです)。
無色のエッジ比較
特に漫画のような画像の場合、画像の色は非常に信頼性が低いです。異なるユーザーは、そのような画像を非常に簡単に再配色したり、異なる色の背景を追加したり、スケッチを取得して色を塗ったりすることもできます。このような画像を一致させる1つの方法は、上記の方法に従っていくつかの基本的な色の削減を行い、得られた色に基づいて画像を比較するのではなく、エッジ検出を実行し、さらに処理して、最も重要な色の変更のアウトラインのみを画像の指標と比較に使用することです。例えば...magick logo: -scale 100x100\! -median 3 \ -quantize YIQ +dither -colors 3 -edge 1 \ -colorspace gray -blur 0x1 outline_image.gif代替案としては、エッジ検出に-lat(ローカル領域しきい値)を使用することをお勧めします。これにより、より適切に制御できる可能性があります...
magick logo: -scale 100x100\! -median 3 \ -quantize YIQ +dither -colors 3 \ -lat 3x3-5% -negate \ -colorspace gray -blur 0x1 outline_image.gifもちろん、比較には線画比較方法を使用します。
??? 実行可能な方法で線画を比較するにはどうすればよいですか ???
画像を掛け合わせて、結果の画像が線の強度を増減させたかどうかを確認します。不一致の線は黒くなります。
Webカメラ
固定カメラで何が変わったか

