ImageMagick 範例 --
影像比較
- 索引
-
ImageMagick 範例前言和索引
-
影像比較方法 -- 有什麼不同?
-
比較統計 -- 有多不同?
-
子影像匹配和定位 在較大的影像中尋找較小的影像。
-
尋找重複影像 -- 尋找兩個相同的影像
-
按類型排序影像 -- 用於比較的影像分類
-
處理特定影像類型
-
影像度量 -- 用於比較的影像指紋
-
網路攝影機 -- 尋找固定攝影機中變化的部分
影像比較方法
比較程式
提供「magick compare
」程式是為了讓您能夠輕鬆比較兩個相似的影像,以確定影像的「差異」程度。例如,這裡有兩個動畫「袋子」的影格,我將它們提供給「magick compare
」以突顯變化的區域。如您所見,您會得到一張白色和紅色的影像,其中包含第二張影像的「陰影」。它清楚地顯示了兩個影像之間發生變化的三個區域。當然,您可以直接檢視「比較」影像,而不是儲存它,我發現通過輸出到特殊的「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
」也會報告很多差異。通過使用較小的 模糊係數,您可以要求 IM 忽略兩個影像之間的這些細微差異。
|
![]() |
-metric
」 的特殊設定值「AE
」(「絕對誤差」計數的縮寫)會將實際被遮罩的像素數量(以目前的模糊係數計算)回報給標準錯誤輸出。 差異影像
若要更清楚地瞭解圖像之間的確切差異,最好是取得更精確的「difference
」合成圖像……
|
![]() |
magick compare
」顯示 JPEG 在圖像之間產生了很多差異,但「difference
」合成圖像卻相當暗,表示所有差異都相對較小。如果產生的圖像太黑而看不到差異,您可以正規化圖像(使用數學上更正確的「-auto-level
」),以便增強結果。
|
![]() |
|
![]() |
difference
」合成方法具有結合性,因此上述範例中兩個圖像的順序並不重要,儘管與「magick compare
」不同,您可以比較不同大小的圖像,目標圖像決定差異圖像的最終大小。當與「magick
」程序一起使用時,不同的方法會更有用,因為您可以在儲存或顯示結果之前進一步處理產生的圖像。例如,您可以設定閾值並合併每個顏色通道,以產生在兩個圖像之間改變顏色的任何像素的遮罩。
|
![]() |
magick compare
」程序的功能,但對顏色和輸出樣式有更多控制。然而,如您所見,它傾向於找出兩張圖像之間即使是最小的差異。如果圖像來自有損圖像文件格式(例如 JPEG)或需要減少顏色和抖動(顏色量化)的 GIF 圖像,則可能會匹配圖像中的所有內容。因此,它通常不是很有用。為了獲得更好的結果,您可以嘗試找出像素顏色的差異程度。例如,我們可以將結果灰階化,以便獲得比彩色圖像更好的比較圖像。
|
![]() |
magick compare
」不同,差異圖像會顯示最終結果中組合的兩個圖像的混合。例如,看看貓咪額頭上似乎出現的奇怪「護身符」。這原本是第一張圖像中包包的把手。這種合併可能會讓人混淆您究竟看到了哪些差異,而且您會看到圖像中添加和刪除的內容合併在一起。由於這種細節上的混淆,「magick compare
」通常是我們人類觀看的更好方式,而「差異」圖像是進一步處理圖像的更好方法。然而,將差異圖像灰階化只會將 RGB 距離平均化(實際上是加權平均)。因此,單個位元的顏色差異可能會因量子捨入效應而丟失。如果圖像之間即使是最小的差異也很重要,則更好的方法是添加差異圖像的單獨顏色通道,以確保捕獲所有差異,包括最小的差異。
|
![]() |
|
![]() |
|
![]() |
-colorspace Gray
」差異圖像(如上)得到的結果非常相似,但它更準確地表示了顏色差異。你可以省略第二個「Pow 0.5
」修改,在這種情況下你將得到一個平方差圖像。還有其他顏色距離度量,你可以在顏色差異,維基百科頁面上閱讀。這些方法大多涉及生成向量差異(見最後),但使用不同的色彩空間,例如 LAB 或 LUV。然而,這在比較現實世界的顏色差異(例如:人類視覺差異測量)時更為重要。另請參閱背景移除,其中像上面這樣的差異圖像用於執行背景移除。你可能還想看看這個關於變化檢測的外部頁面,作為其實際應用的例子。 閃爍比較
除了「magick compare
」程序之外,查看圖像之間差異的另一種方法是以相當快的速度對相似圖像進行閃爍比較。
|
![]() |
flicker_cmp
」,它在兩個圖像之間來回切換,就像上面的例子一樣。它還在顯示圖像的底部添加了一個標籤,以便詳細說明你在任何特定時刻看到的圖像是哪一個。 比較動畫
你還可以 使用特殊的「膠片條」技術比較兩個合併動畫的差異。請參閱並排附加中的類似「附加」技術。基本上,我們將所有動畫幀附加在一起,形成一個更大、更長的圖像。然後比較這兩個圖像,並通過將動畫再次拆分為單獨的幀來創建一個新的動畫。例如...
magick \( anim1.gif -coalesce -append \) \ \( anim2.gif -coalesce -append \) miff:- | \ magick compare - miff:- |\ magick - -crop 160x120 +repage anim_compare.gif |
-crop
」大小必須與動畫的原始大小相匹配。此外,動畫將失去它可能具有的任何可變時間延遲,使用基於原始動畫第一幀的恆定時間延遲。另一種對動畫有用的圖像比較技術是用於定位動畫發生變化的所有區域,以便劃分動畫的不連接部分。通過這種方式,你可以將大型動畫分離成許多較小的動畫。請參閱拆分動畫。比較統計數據
兩張圖片到底有多麼不同?


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.dev.org.tw/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.dev.org.tw/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.dev.org.tw/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... |
直接比較
如果兩個映像的大小相同,您可以直接比較它們(使用「magick compare
」程式),以查看它們的匹配程度。(見上文)這非常慢,而且根據我的經驗,在對全尺寸映像使用時不太有用,因為它太慢了。但是,這可能是了解兩個映像相似程度的最佳方法。映像分類
在我嘗試比較映像時,我發現彩色、卡通和素描與其他類型的映像相比都非常不同。線條圖和灰度映像尤其容易出現比彩色映像更小的差異,幾乎所有比較方法都是如此。基本上,由於顏色都在一條線上,任何顏色度量都傾向於將這些映像放置得更近 3 倍(一維色彩空間與三維色彩空間)基本上,這意味著將您的映像至少分成這兩組可能是任何認真嘗試查找重複或非常相似映像的第一步。其他主要分類或映像類型也可以通過減少您比較的映像數量來簡化映像比較。請參閱下面的映像分類。縮圖比較
您有一個程式在記憶體中創建了許多小的縮略圖(比如 64x64 像素)來比較圖像以尋找重複項,您將透過直接比較來進行這項操作。這通常是人們(包括我自己)嘗試做的第一件事,事實上這也是大多數圖像比較程式(例如照片處理軟體)所做的技術。事實上,這種方法很有效,並且確實能找到完全匹配的圖像。此外,透過一點模糊處理和降低差異閾值,它甚至可以找到經過輕微裁剪和調整大小的圖像。然而,嘗試在記憶體中儲存 10,000 個這樣的縮略圖通常會導致普通電腦開始頻繁讀寫磁碟,變得非常緩慢。或者,儲存所有這些縮略圖(除非程式出於使用者檢視原因而這樣做)會佔用大量的磁碟空間。一種改善磁碟頻繁讀寫問題的方法是,在記憶體中只保留較少數量的圖像。也就是說,透過分組比較圖像,而不是將一張圖像與所有其他圖像進行比較。一種自然的做法是按目錄分組,並將每個目錄的圖像與其他目錄的圖像進行比較。事實上,這種方法相當不錯,因為圖像往往會被分組在一起,而這組圖像通常會與一個相似的組匹配。因此,按目錄對輸出匹配的圖像是一個額外的好處。此外,兩張圖像的可接受相似程度取決於其圖像類型。比較兩個線條圖需要非常小的「閾值」來排除不同的圖像,而比較具有大面積顏色的圖像通常需要更大的閾值才能捕捉到經過裁剪的相似圖像。真實世界的圖像有一個更大的問題,即紋理會在具有非常輕微偏移的圖像之間產生非常嚴重的疊加差異。因此,您可能需要將此類圖像簡化為一般的顏色區域,方法是使用中值濾波器、模糊處理、顏色減少或顏色分割。經過這樣的處理後,真實世界的圖像通常可以像卡通一樣進行比較。圖像度量
為每個圖像創建一個小的度量標準是一個線性排序 (O) 操作。而將所有圖像與所有其他圖像進行比較則是一個平方排序 (O^2) 操作。度量標準的用意並非實際找到匹配的圖像,而是將相似的(可能匹配的)圖像分組,以便您可以在較小的組上進行更密集的比較。因此,任何度量標準比較都應該是寬鬆的,並且接受匹配機率較低(但仍然有可能)的圖像。但它不應該過於寬鬆,以至於包含過多的不匹配項。此外,您可能還想考慮使用多個度量標準,因為某些度量標準可能會匹配其他度量標準可能會「錯過」的圖像,因為它們落在不同的相鄰區域(閾值不匹配)。下一節(度量標準)列出了我已經試驗或理論化的一些不同的圖像生成的度量標準,包括:平均顏色、主要顏色、前景背景、邊緣顏色、顏色矩陣等。Günter Bachelier 還報告了使用更奇特的度量標準進行圖像比較的可能性,例如:傅立葉描述符、分形維數、凸面積、長短軸長度和角度、圓度、凸度、捲曲度、堅固性、形狀方差、方向、歐拉數、邊界描述符、曲率、彎曲能量、總絕對曲率、面積、幾何中心、質心、緊密度、偏心率、關於中心的矩等等。我目前的工作是生成和使用一個簡單的 3x3 顏色平均值矩陣來表示圖像(請參閱下面的顏色矩陣度量標準)。在生成(或請求)這些度量標準時,會將其(以及其他文件資訊)快取到每個目錄中的特殊文件中。這樣,我只在沒有可用的快取度量標準或圖像發生更改時才需要重新生成特定的度量標準。相似性或距離
可以使用許多不同的方法來比較兩張圖像的度量指標(或實際圖像),通常會產生單一距離度量或「相似性度量」,可用於將「相似」圖像聚類在一起。- 直接閾值或最大差異(切比雪夫距離)
只需通過任何單一度量指標中的最大差異來比較圖像。
閾值將在多維度量空間中產生一個由相似圖像組成的超立方體。當然,圖像差異僅基於一個度量指標,而不是所有度量指標。 - 平均差異(平均距離,平均曼哈頓距離)
將所有差異相加,並選擇性地除以度量指標的數量。
這也稱為兩個度量指標之間的曼哈頓距離,因為它等於您在城市網格中移動所需的距離。所有度量指標的貢獻度相同,導致事物看起來比您預期的「更接近」。在空間中,此度量指標的閾值將產生一個菱形。 - 歐幾里得(畢氏)差異
或者度量空間中度量指標之間的直接向量距離。
當涉及更多度量指標時,該值往往會更大。但是,一個產生很大差異的度量指標往往比其他度量指標貢獻更大。閾值在度量空間中產生一個球形體積。 - 數學誤差/數據擬合或(轉動慣量???)
將所有差異的平方和相加,然後取平方根
這通常用於計算數學曲線與特定數據集的擬合程度,但也可以用於比較圖像度量指標。
這似乎提供了最佳的非向量距離度量。 - 向量角
找到由圖像度量指標創建的向量空間中心到兩條線之間的角度。這應該消除可能已應用於兩張圖像的任何對比度或圖像增強效果。
尚未測試 - 向量距離
對於線條圖或灰度圖像,其中度量指標中的所有單個顏色向量都朝向相同的方向,度量指標與圖像平均顏色的相對距離可能更為重要。相對於最大距離對距離進行標準化可以減少對比度的影響。
也就是說,這是一種線條圖圖像比較方法。
尚未測試 - 聚類分析
繪製所有度量指標,並將其分組到多維空間內的相似聚類中。一個好的聚類包甚至可能能夠發現並忽略不產生聚類的度量指標。
尚未測試
人工驗證
在電腦完成尋找匹配圖像的嘗試後,則由使用者實際驗證圖像是否匹配。向使用者呈現匹配結果也可能是一項艱鉅的任務,因為他們可能希望能夠...- 並排查看圖像
- 以原始大小(可選擇通用「縮放」大小)在兩張圖像之間快速切換。
- 在不同縮放和平移的圖像之間切換或疊加,以嘗試匹配圖像。
- 查看同一目錄(來源)或可能是同一聚類(其他近似匹配)中的其他圖像,以便處理整個組而不是單獨處理每個圖像。
- 在兩個(或多個)目錄之間重命名、移動、替換、刪除、複製圖像,以整理圖像並拒絕其他圖像。
- 等等...
magick display
」和「magick montage
」,以及圖片瀏覽器「XV
」和「GQview
」。然而,我仍然樂於接受其他建議,例如能夠同時打開兩個或多個目錄,並顯示來自多個目錄的集合或圖片組的程序。遠端或由其他程序或腳本控制的功能至關重要,因為它允許以對使用者來說最佳的方式設定和呈現圖片組,以便於查看和處理。目前還沒有程序能完全滿足我的需求。例如,「gqview
」具有集合和單一目錄視圖,但不允許多目錄視圖,也不允許遠端/命令列控制呈現方式。此外,集合不會顯示每個圖片來自哪個目錄,也不能將單一目錄視圖切換到其他目錄。它也沒有遠端程序控制功能。另一方面,非常古老的「xv
」允許多目錄視圖(它使用多個「視覺快照」窗口)和在其控制窗口中顯示集合列表,但一次只能查看一張圖片,並且只能從其命令列打開和定位一個目錄。當然,它也沒有遠端控制功能。這些是我找到的最佳人工驗證程序,我使用腳本為每個圖片組、匹配對或所有組匹配的圖片設置和啟動它們。但沒有一個程序能讓我完全滿意。對我來說,燈箱和相關軟體似乎是整理圖片的更好方法,但這需要更大的觸控螢幕,成本也隨之大幅增加。跨類型圖片比較
我想要做的比較困難的事情之一是找到從另一張圖片創建的圖片。例如,我想要將某人繪製線稿,然後由其他人上色或繪製成卡通或甚至超寫實圖片進行匹配。也可能添加了背景。這些事情非常困難,我對邊緣檢測技術的實驗至今還沒有結果。找到合適的度量標準是關鍵,因為人類可以更好地建立「相似性」的聯繫,但您仍然需要找到可能的匹配項呈現給使用者。尋找重複圖片的總結
總之,我目前尋找和處理重複圖片的程序是一個用於查找和分類「相似」圖片的程序管道。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如您所見,我正在尋找一種高度分階段的方法。歡迎您將您的想法寄給我!!!
按類型排序圖片
確定圖片的類型很重要,因為大多數比較圖片的方法只適用於特定類型的圖片。例如,將文字圖片與藝術家草圖進行比較是沒有意義的。在幾乎是純白色(草圖)的圖片上使用彩色圖片比較方法也沒有用。通常,比較圖片時,首先要做的是確定圖片使用的類型或「色彩空間」。圖片的基本分類可以包括...- 黑白線畫或文字圖片(幾乎所有顏色都相同)
- 由兩種基本顏色組成的圖片 - 比例相等(圖案圖片?)。
- 灰階藝術家繪畫(有很多陰影)
- 線性彩色圖片(顏色形成漸變,但不是從黑色和白色開始)
- 卡通風格的彩色圖片,有大面積的純色區域。
- 具有陰影顏色區域的真實圖片
- 圖片包含一些標註文字或徽標疊加層。(單一顏色的尖峰)
- 整張圖片的平均顏色
- 圖片中的主要顏色
- 圖片的前景/背景顏色。
灰階影像
檢查圖像是否為灰階圖像的最簡單方法是查看圖像的色彩飽和度級別。也就是說,可以透過將圖像轉換為「色調」圖像色彩空間並獲取顏色通道(通常是綠色通道)的平均值和最大值來輕鬆完成。例如..這些數字會標準化為 0 到 1 的範圍。如您所見,「玫瑰」色彩非常豐富(平均 30%),峰值也很高(接近 1)。然而,「花崗岩」圖像的飽和度非常低(約 2%),峰值也很低。雖然它不是純灰階圖像,但非常接近。低平均值和高峰值表示存在小塊的強烈顏色。對相同通道進行閾值處理可以生成圖像中彩色區域的遮罩。問題:上述方法無法找到顏色呈線性的圖像。也就是說,僅包含形成線性顏色漸變的顏色的圖像,例如泛黃(棕褐色)照片或藍圖。這些本質上是彩色的灰階圖像。請參閱下一種圖像類型。圖像是線性顏色嗎
另一種技術是對圖像中的所有顏色(或簡化的色彩矩陣指標)進行 3 維線的直接「最佳擬合」。擬合的誤差(通常是誤差平方的平均值)可以很好地指示圖像與該線的擬合程度。將一條線擬合到 3 維圖像通常涉及一些向量數學。結果不僅會告訴您圖像是否使用接近「線性」的顏色集,而且適用於任何顏色範圍,不僅僅是從亮到暗,還包括黃色紙上的灰色線條。該結果還可以用於將圖像魔術般地轉換為更簡單的「灰階」圖像(或者僅僅是將一組顏色指標魔術般地轉換為灰階指標),以便進行更簡單的比較和更好的匹配查找。我的試驗測試程序甚至沒有使用完整的圖像來進行此確定,而是使用下面一個簡單的 色彩矩陣指標(9 種顏色,27 個值)來表示圖像。但是請注意,此測試通常無法很好地區分未著色的線條圖。此類圖像幾乎完全是單一背景顏色(通常是白色),因此我的圖像可能不會顯示任何形式的線性顏色漸變。應該先使用其他測試將它們分離出來(請參閱下一項,實際上要容易得多)。如果您感興趣,請給我發郵件,並告訴我您嘗試過的方法。純黑白圖像
要查看圖像是否是接近純黑白的圖像,幾乎沒有任何顏色甚至灰色(由於反鋸齒),我們可以巧妙地使用「-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 輸出]](../images/midtone_image.jpg)
文字與線條繪圖
如果你的圖片幾乎完全是單一顏色(通常是白色),那麼你可以嘗試查看圖片內容是否可以歸類為文字或線條圖。文字將包含許多小的、不連接的物件,通常分組成水平線。另一方面,線條圖應該將所有內容都連接在一起,並涉及許多不同的角度。請注意,卡通風格的彩色圖像也可以轉換為線條圖,以便進行更簡單的圖像比較,因此線條圖比較方法將是一個有用的工具。有人嗎?要了解更多關於文字的資訊,請參閱 IM 論壇中討論的一些技術,檢查圖像是否包含文字。真實 vs 卡通
基本上,卡通具有非常特殊的色塊,具有清晰的邊界區域,通常使用分隔的黑線使其更加清晰。它們通常也具有最小的漸變或陰影效果。然而,真實圖像具有許多柔和的邊緣效果、顏色漸變和紋理,並使用許多不同的顏色。當然,這並不總是正確的。真實圖像可能具有非常像卡通的品質,特別是在使用非常高的對比度時,而且一些現代卡通非常逼真,以至於很難將其歸類為卡通。一般來說,真實圖像和卡通之間的主要區別在於紋理和漸變。因此,要確定圖像的類型,需要將圖像與去除精細紋理的相同圖像進行比較。差異很大意味著圖像更「逼真」和「真實世界」,而不是「卡通化」或「扁平」。還要記住,線條圖、藝術家草圖和文字在風格上也可能非常像卡通,但具有如此精細的紋理和細節,以至於上述方法可能會將圖像視為真實世界。因此,線條圖和草圖應事先分離出來。Jim Van Zandt 提供了以下解決方案...
- 寫出每個像素的顏色
- 按顏色排序
- 寫出每種顏色的像素計數
- 按像素計數排序
- 瀏覽列表,直到你統計了圖像中一半的像素。
- 如果 #像素 >>> #顏色,則它是卡通風格的。
直方圖:
」範例。如果你已經創建了某種圖像分類方案.. 即使只是粗略的,也請讓我們知道你的結果,以便其他人(包括我自己)可以受益。
處理特定圖像類型
以下是關於更具體的圖像確定技術的說明和資訊。掃描不良或列印輸出
在現實世界中,事情從來不像你希望的那樣完美。掃描儀的感應器損壞,印表機滾筒有刮痕。這兩個問題通常會導致掃描和列印輸出包含長垂直線。然而,確定圖像是否具有這些垂直線相當容易。這個想法是將圖像中所有行的像素平均在一起。任何「缺陷」都將在最終像素行中顯示為尖銳的突起,你可以使用像素行的「閾值直方圖」來計算其數量。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
垃圾郵件圖像
垃圾圖片通常會在圖片的色彩直方圖中顯示出一個主要的純色峰值。檢查圖片中的顏色通常會發現它位於圖片的某個角落。但是,這不適用於卡通類型的圖片。電子郵件垃圾圖片
這些圖片的設計目的是繞過各種垃圾郵件過濾器。基本上,廣告文字會使用各種顏色隱藏在圖片中,並添加額外的「雜訊」和其他雜訊,使其更難被偵測。雖然這些圖片很難與公司電子郵件標題的標誌區分開來,但它們通常也比典型的電子郵件標誌大得多。一種發現技巧是對圖片使用大型中值濾波器。電子郵件垃圾文字通常會消失,而標誌或圖片仍然會非常鮮豔。圖片度量,快速查找要比較的圖片
度量代表一種「指紋」,用於在非常小的記憶體量中表示圖片。相似的圖片應該會產生相似的度量。但請注意,度量的設計目的不是實際查找匹配的圖片,而是嘗試排除絕對不匹配的圖片。也就是說,良好的度量可以讓您忽略大多數圖片,無需進一步比較,從而減少搜尋所有圖片所需的時間。圖片的平均顏色
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之後,直方圖將顯示每種主要顏色的數量。但是,通常卡通或線條圖的主要顏色是圖片的背景顏色。因此,它只對真實圖片真正有用。另一方面,您可以通過將其與圖片的平均邊框顏色進行比較,來判斷圖片是否具有真實背景。請注意,圖片的主要顏色更有可能受到圖片背景顏色的強烈影響,而不是感興趣的對象。也就是說,通常位於圖片的中心或附近。
邊框顏色
通過反覆裁剪圖片的四個邊緣(最多 2 到 3 個像素),並計算邊框的平均顏色,您可以確定圖片是否已加框,以及加框的深度。圖片是否有明確的背景。或者,整個圖片是否存在某種類型的的天空/陸地或特寫/遠景顏色分離。通過比較平均邊緣顏色和圖片的平均中心顏色,您可以發現圖片是否均勻,沒有中心主題或對象,例如空曠景觀的照片。直方圖 - 一般色彩匹配
對於與圖像中存在的顏色類型相關的度量標準,會使用某種形式的直方圖。這是通過創建一個「顏色區間」數組並在找到顏色時增加每個「區間」的計數來完成的。現在我看不到你為每個圖像都存儲一個大的直方圖!因此,你要麼只在直方圖中存儲最主要的顏色,要麼使用少得多的區間數(每個區間中有更多像素)。「顏色區間」的普通直方圖實際上效果不是很好。原因是每種顏色總是會落入一個區間。也就是說,每個像素都以全有或全無的方式添加到每個區間中,而無需考慮該顏色與區間邊緣的接近程度。反過來,這不會構成一個好的度量標準。一種解決方案是創建一個具有重疊區間的直方圖。也就是說,每種顏色(黑色或白色除外)將落入兩個顏色區間中。然後,稍後當你比較圖像時,相近的顏色將至少匹配這些區間中的一個。另一種選擇是通過讓每種顏色根據其與區間中心的接近程度來貢獻每個「區間」來創建直方圖。也就是說,一個區間邊緣的顏色實際上會在兩個區間之間共享。這將生成一種模糊的或插值的直方圖,但這種直方圖可以更準確地表示圖像,尤其是在僅使用非常少數量的顏色「區間」時。此外,直方圖傳統上要么只是圖像的灰度分量,要么是三個獨立的 RGB 分量。但這不是一個很好的表示。你可以嘗試使用色相、飽和度和亮度直方圖來更好地表示圖像。或者,為什麼要將自己限制在一維直方圖中。如何將顏色映射到整個顏色空間中的一組真實顏色!也就是說,為什麼不直接對「紅色」值進行分箱,而是在一個三維顏色區間中對其進行計數(無論什麼顏色空間效果最好)。這將生成一個可以真正表示圖像中發現的顏色的直方圖。這樣一個三維直方圖度量標準可以是一個簡單的數組,例如 8x8x8 或 2048 個區間。也就是一個 2KB 的度量標準。然後,顏色搜索將找到正確數量的附近區間,並獲得附近區間的插值計數。這將表示圖像中「接近」該顏色的顏色數量!前景/背景顏色分離
使用 -colors,你可以嘗試通過將圖像縮減為僅兩種顏色來將圖像分離為前景和背景部分。首先使用 -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 種顏色重做,然後在進行最終測試之前使用找到的最常見的「背景」顏色擦除該區域。這種技術可能是將圖像分為「膚色」、「綠色植物」、「風景」等類別的好方法。
平均顏色矩陣
三乘三矩陣配色方案(「-scale 3x3\!
」)是一種合理的色彩分類方案。它可以很好地分離和組合相似的圖像。例如,素描(全部接近白色)、灰階、風景、海景、房間、人臉等,都將被分為基本且相似的組別(理論上)。這也是為生成 照片馬賽克 而對圖像進行索引時可以使用的合理指標。NetPBM 圖像格式的輸出特別適合生成這樣的指標,因為它可以僅輸出作為文本數字的像素值。請記住,這會產生一個 27 維的結果(3x3 種顏色,每種顏色 3 個值),因此可能需要多維聚類算法。 *你知道一個好的 3D 聚類程序/算法嗎?* 例如,這是 IM 標誌的 3 x 3 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當然,就像之前的平均顏色指標一樣,這在匹配顏色經過修改的圖像(例如色調或亮度變化)時也會遇到問題。(請參閱下一節)此外,此指標可以分離其組內的線條圖,儘管僅以非常通用的方式。此類繪圖仍將更多地按背景「紙張」的顏色而不是內容進行分組,並且通常需要比彩色圖像更小的相似度「閾值」。
色差矩陣
直接使用顏色作為指標的最大問題是,您將圖像與特定的通用顏色綁定在一起。這意味著任何已調亮或調暗或其色調已更改的圖像都不會被組合在一起。解決方案之一是以某種方式從指標中減去圖像的主要或平均顏色,並且使用顏色矩陣可以實現這一點。例如,在這裡,我從矩陣中的所有周圍顏色中減去中間或中心的平均顏色。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,因為您無法在圖像中保存負顏色值。此外,使用緩慢的「
-fx
」運算符是可以接受的,因為只處理 9 個像素。請注意,中心像素(上面第二行開頭的「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這也可以由指標比較器而不是指標生成器來完成。該指標仍然可以很好地分離和聚類彩色圖像,將相似的圖像放置得非常靠近,而無論任何一般顏色或亮度變化如何。但它仍然對對比度變化很敏感。實際上,這種指標修改可以在比較過程中完成,因此原始的 顏色矩陣指標 仍然可以用作要收集、緩存和比較的標準圖像指標。這是我自己現在正在做的大規模圖像比較的做法。與直接的顏色平均值不同,您可以使用此指標來區分不同的線條圖圖像。但是,由於線條圖使用線性色階(所有顏色都落在指標空間中的一條線上,因此圖像之間的差異大約是彩色圖像的三分之一。因此,在比較線條圖時需要非常不同的閾值。因此,最好還是將線條圖和灰階圖像與彩色圖像分開。換句話說,這是我迄今為止發現的用於彩色圖像的最佳指標之一。只要確保首先確定哪些圖像是線條圖,並使用低得多的閾值分別比較它們。幸運的是,指標本身可以用於將圖像分離為 灰階 或 線性彩色圖像。歡迎提出建議。
鄰居差異
以上方法會生成一個 3x3 矩陣,減去中心像素,並將所有值偏移到完美的灰色。 然而,更好的方法是,不要嘗試保存單個細胞的顏色,而是生成每個細胞及其鄰居(8 個鄰居)之間的差異。 也就是說,不要保存左上角的顏色,而是保存該角與頂部中間、中心和左中間之間的差異。 當然,即使使用一個小的 3x3 陣列,您最終也會得到一個包含 12 個差異的簽章,儘管您不需要對完整差異進行編碼,只需編碼一般的差異級別即可。 例如,相等或大/小正/負差值 這更有可能找到匹配的圖像,即使在包含截然不同顏色的圖像之間也是如此,因為實際顏色在簽章中完全不起作用。 “libpuzzle” 圖像比較庫正是這樣做的,儘管它使用的是 9x9 矩陣,並且只對每個細胞的中心像素進行平均。 它還將自身限制為圖像的灰度版本。 該技術在一個 postscript 論文中得到了完整的定義,圖像簽章適用於任何類型的圖像。 該論文還介紹了將該簽章存儲在數據庫中的方法,以及如何實際執行查找以找到具有相似(不一定相同)簽章的圖像。 這是我發現的第一篇實際詳細介紹如何做到這一點的論文。 :-)感知哈希
將圖像縮小至 8x8 並計算平均強度。 如果像素高於平均值,則 64 位哈希的每一位為 1,如果低於平均值,則為 0。 要比較兩幅圖像之間的相似性,您只需逐位比較位哈希,並返回漢明距離。 漢明距離越近,圖像越相似。 任何超過 21/64 的都被認為不相似。 pHash 似乎使用 YCbCr 編碼。 一些人談論直接使用 JPEG 中的 DCT,而最有希望的是使用幅度/相位並將其映射到對數極坐標系。更好地匹配圖像
我沒有嘗試過或對比較較大圖像以進行更精確的圖像匹配效果不佳的雜項註釋和技術。分割顏色
如您所見,上述許多指標都使用模糊/中值濾波器,然後顏色減少技術是簡化圖像以更好地對其進行分類的基本嘗試。 然而,顏色量化運算符 並不是為此目的而設計的。 它的工作是減少顏色,以突出顯示圖像的重要細節。 然而,對於圖像比較,我們並不是真的想要突出顯示這些特徵,而是突出顯示具有比較意義的區域。 這是稱為分割的相關顏色技術的工作……旁白:來自 Leptonica:圖像分割是將圖像劃分為具有不同屬性的區域。 此運算符會遮蔽顏色相似的區域,從而消除這些區域的細節。 然後,當您比較兩幅圖像時,您比較的是區域而不是圖像中的低級細節。 IM 實現了一種分割算法“-segment
”,有關其實現細節,請參見 SegmentImage()。 例子magick logo: -median 10 -segment 1x1 \ +dither -scale 100x100\! segment_image.gif其中一個問題是 -segment 的速度非常慢,而且它似乎只適用於較大的圖像。小型圖像(例如玫瑰:或縮放到 100x100 的標誌:)似乎只會產生單一顏色。這可能是一個錯誤。當然,您仍然可以在分割圖像後縮放圖像,就像我們上面所做的那樣。這樣您就可以在內存中存儲大量圖像以相互比較。此外,與 Leptonica 提供的圖像分割算法相比,生成的分割似乎效果不佳。請參閱Leptonica:顏色分割。但是,IM 分割的替代方法是使用顏色量化功能來查找顏色相似的區域。示例
magick logo: -scale 100x100\! -median 3 \ -quantize YIQ +dither -colors 3 segment_image.gif缺點是 -color 限制了圖像中可能存在的顏色區域的數量,而 segment 會嘗試保留相似的區域,而不管圖像中實際存在多少個區域(或者至少它應該這樣做)。
無色邊緣比較
眾所周知,圖像顏色並不可靠,尤其是對於卡通類圖像。不同的用戶可以很容易地重新著色這些圖像、添加不同的背景顏色,甚至可以繪製草圖並為其著色。匹配此類圖像的一種方法是進行一些基本的顏色約簡,如上述方法,但不是根據生成的顏色比較圖像,而是執行邊緣檢測和進一步處理,以便僅使用最重要顏色變化的輪廓來進行指標和圖像比較。例如...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當然,為了進行比較,您可以使用線條圖比較方法。
???你如何以可行的方式比較線條圖???
將圖像相乘,看看生成的圖像是否增加或減少了線條的強度。不匹配的線條將變為黑色。
網絡攝像頭
固定攝像頭的變化

