이미지의 "균일성"을 프로그래밍 방식으로 결정

이미지의 "균일성"을 프로그래밍 방식으로 결정

수천 개의 자산을 미리보기로 표시하는 스크립트를 작성하려고 합니다. 이러한 리소스의 대부분은 Flash를 사용하며 명령줄에서 크롬 브라우저를 통해 캡처합니다. 이제 나는 그것이 작동하도록 하기 위해 그 옆에 서 있어야 하는데, 이것이 바로 PITA입니다. 도움이 되는 것은 꽤 자주 발생하는 것처럼 보이는 실패한 썸네일을 만들었을 때 내 스크립트에 이를 알려주는 것입니다.

"실패"는 짙은 회색이나 흰색 등 균일한 색상인 경향이 있으며, 저는 이 "균일성"을 프로그래밍 방식으로 미리보기 이미지의 성공을 평가하는 방법으로 사용할 수 있을 것이라고 생각했습니다. 여기 몇 가지 예가 있어요.

https://dl.dropboxusercontent.com/u/846812/permanent/thumb_examples/fail_1.jpg https://dl.dropboxusercontent.com/u/846812/permanent/thumb_examples/fail_2.jpg https://dl.dropboxusercontent.com/u/846812/permanent/thumb_examples/success1.jpg https://dl.dropboxusercontent.com/u/846812/permanent/thumb_examples/success2.jpg

이것을 (내 생각에) 더 어렵게 만드는 것은 짙은 회색이 균일한 색상이 아니라 반복되는 픽셀 패턴이라는 것입니다. 자세히 보면 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

그래서 균일하지만 균일하게 반복되는 패턴입니다.

누구든지 명령줄에서 이 작업을 수행하는 방법을 생각할 수 있습니까?

답변1

프로그래밍 방식으로 이 작업을 수행하는 방법을 모르겠습니다. 100% 정확한 것은 아니지만 화면 캡처에 가까운 작업을 수행하고 있으므로 실제로 화면에서 이미지를 시작하고 사용하는 것이 xdtool좋습니다. 샘플 이미지의 여러 점을 무작위로 샘플링하고 픽셀 색상을 감지합니다. 색상의 전부 또는 95% 이상이 동일하면 이미지가 단색이라고 안전하게 말할 수 있습니다.

또 다른 접근 방식은 일반적인 오류 이미지를 저장하고 이미지 크기를 오류 이미지의 크기와 비교하는 것입니다. 저는 VLC를 사용하여 비디오 라이브러리의 비디오에서 정지 이미지를 추출하고 있는데, 이 작업을 수행하는 동안 이미지의 대비가 높을수록 캡처한 png 파일의 크기가 더 커진다는 것을 깨달았습니다. 따라서 이미지 크기가 너무 작은지 확인해주세요. 결국 이미지 압축은 반복되는 패턴의 저장을 최소화하는 것입니다. 이 사실을 유리하게 활용할 수 있습니다.

답변2

당신은 시도 할 수 있습니다방법닐 크라비츠사진 법의학실제로 평판은 다음과 같습니다.

  1. 크기를 줄입니다. Krawetz는 이미지를 8x8 정사각형으로 "분쇄"했습니다.
  2. 8x8 이미지의 색상을 회색조로 줄입니다.
  3. 64개 색상의 평균을 계산합니다.
  4. 64비트 숫자 계산(8 * 8 = 64) - "각 비트는 단순히 색상 값이 평균보다 높은지 낮은지에 따라 설정됩니다.
  5. 해시를 구성합니다. Krawetz가 해시 값으로 64비트를 사용하는 것 같습니다.

이런 종류의 작업은 회색조 이미지를 흑백 이미지와 매우 다른 해시로 바꿀 수 있습니다. 이를 위해 쉘이 아닌 스크립트 코드를 작성하거나 찾아야 할 수도 있습니다.

또 하나 생각나는 것은메인 컬러를 찾아보세요이미지에서. 그 사람은 Imagemagick과 를 사용하는데 awk, 상황이 동일하거나 유사한지 어떻게 테스트할 수 있는지 잘 모르겠습니다.

고쳐 쓰다

방금 알아냈어퍼즐 풀기우연히 '비슷한 이미지를 찾을 수 있는 도서관'. 원하는 작업을 수행하려면 약간의 코딩만 필요합니다.

게다가pH 값, 오픈 소스 지각 해싱 라이브러리입니다. 동일한 양의 인코딩이 필요할 수 있습니다.

libpuzzle에는 PHP 인터페이스가 있는 반면 pHash에는 C 프로그램 작성을 요구하는 것 같기 때문에 이들 중 어느 것도 귀하의 요구 사항을 정확히 충족하지 않습니다.

답변3

imagemagick을 사용하여 FFT를 계산하고 이를 알려진 불량 이미지와 비교할 수 있습니다.

http://www.fmwconcepts.com/imagemagick/fourier_transforms/fourier.html#im_fft

답변4

제가 알아낸 대로 답변을 직접 작성해 보겠습니다. 글쎄, 어쨌든 내 테스트 이미지에서는 작동하는 것 같습니다. 댓글에 이미 설명이 되어있습니다.

#!/bin/sh

#Tests whether an image is uniform (ie a simple repeated pattern or a single colour.)  

#The logic is as follows:
# - convert the image to an 8x8 px temp BMP image.  
#(we need to use bitmaps because we need exact pixel values 
#with no random compression artifacts)
# - convert THAT to a 1x1 px BMP image
# - convert the 1 px image back to an 8x8 px BMP image.

#If the first 8x8 image is the same (according to `diff`)   
#as the scaled-to-1px-and-back-again image, 
#then we can conclude that the first 8x8 image was totally uniform,
#(ie every pixel exactly the same) 
#and from this we can conclude that the original full size image 
#was also uniform:  not necessarily the same colour in every pixel,  
#but not varied enough for our requirements.

source=$1
small1=/tmp/small_image.bmp
small2=/tmp/small_image2.bmp
tiny=/tmp/tiny_image.bmp

#the \! after 8x8 tells it to ignore the aspect ratio and just squash it to those dimensions
convert "$source" -resize 8x8\! "$small1"
convert "$small1" -resize 1x1 "$tiny"
convert "$tiny" -resize 8x8 "$small2"
diff "$small1" "$small2" > /dev/null
result=$?
if [ $result -eq 0 ]; then
  #diff gives an empty return, so the files are the same, which means there wasn't variation
  echo "Image is uniform" >&1
else
  #we found a difference between the pre-squashed and resized versions which means there WAS variation
  echo "Image is not uniform" >&1
fi

관련 정보