수천 개의 자산을 미리보기로 표시하는 스크립트를 작성하려고 합니다. 이러한 리소스의 대부분은 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
당신은 시도 할 수 있습니다방법닐 크라비츠사진 법의학실제로 평판은 다음과 같습니다.
- 크기를 줄입니다. Krawetz는 이미지를 8x8 정사각형으로 "분쇄"했습니다.
- 8x8 이미지의 색상을 회색조로 줄입니다.
- 64개 색상의 평균을 계산합니다.
- 64비트 숫자 계산(8 * 8 = 64) - "각 비트는 단순히 색상 값이 평균보다 높은지 낮은지에 따라 설정됩니다.
- 해시를 구성합니다. 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