回答
更新回答
在隨後的幾年,我所遇到的一個簡單的解決方案,所以我想我會更新它使任何人看到它可以得到的好處最新和最偉大的。
開始一樣的,通過提取阿爾法層到其自己的圖像,並倒轉:
convert start.png -alpha extract -negate intermediate.png
現在起執行「連接成分分析」:
convert start.png -alpha extract -negate \
-define connected-components:verbose=true \
-define connected-components:area-threshold=100 \
-connected-components 8 -auto-level result.png
Objects (id: bounding-box centroid area mean-color):
0: 256x256+0+0 128.7,130.4 62740 srgb(0,0,0)
3: 146x8+103+65 175.5,68.5 1168 srgb(255,255,255)
2: 9x93+29+42 33.0,88.0 837 srgb(255,255,255)
1: 113x7+4+21 60.0,24.0 791 srgb(255,255,255)
你會看到有一個標題行和4行輸出,每個在e nd,第一行是黑色的,對應於整個形狀,最後三行是白色的,對應於三個透明區域。它基本上是你想要的最後三行中每一行的第二個字段。所以,146x8+103+65
意味着一個框寬146px,高103px,偏左103px,右上角65px,左上角偏下65px。
如果我畫的那些,紅色,你可以看到它已經確定:
convert result.png -stroke red -fill none -strokewidth 1 \
-draw "rectangle 103,65 249,73" \
-draw "rectangle 29,42 38,135" \
-draw "rectangle 4,21 117,28" result.png
原來的答案
以下可以幫助你到一個答案,但我還沒有開發完成 - 人們經常提出問題,然後從不登錄aga在這方面還有很多努力......
讓我們先從這個輸入圖像 - 其中白色區域是透明的:
您可以用ImageMagick的從圖片中提取alpha通道是這樣的:
convert input.png -alpha extract -negate alpha.png
這給這裏,白色區域是透明的
好了,一個辦法是找白色區域的邊界框,你可以用trim
做到這一點,它會給你包圍白色區域的邊框:
convert input.png -alpha extract -format "%@" info:
245x114+4+21
所以邊框寬度爲245px,高114px,從左上角偏移+ 4 + 21開始。我可以繪製圖像上顯示它:
所以,這是一個開始。
此外,您還可以得到ImageMagick的枚舉文本格式的像素,這樣你就可以運行這個命令
convert input.png -alpha extract -negate txt: | more
# ImageMagick pixel enumeration: 256,256,255,gray
0,0: (0,0,0) #000000 gray(0)
1,0: (0,0,0) #000000 gray(0)
2,0: (0,0,0) #000000 gray(0)
它告訴你該圖像是256×256,而且前3個像素是全黑的。如果你想在白色的(即透明的),你可以這樣做:
convert input.png -alpha extract -negate txt: | grep FFFFFF | more
4,21: (255,255,255) #FFFFFF gray(255)
5,21: (255,255,255) #FFFFFF gray(255)
6,21: (255,255,255) #FFFFFF gray(255)
7,21: (255,255,255) #FFFFFF gray(255)
這就告訴你,像素4,21是你的透明區域的左上角 - 我很高興它的輸出匹配上面的邊界框方法:-)
因此,您可以輕鬆獲得所有透明像素的列表。這種方法可以開發出來,或者類似的Ruby(RMagick)編碼來找到黑色的連續區域 - 但這超出了目前的答案範圍 - 因爲我不是Ruby程序員:-)
好的,我今天下午學了一些Ruby,請不要笑,這是我的第一個Ruby程序。它可能相當醜陋,更像Perl或C(我的首選語言),但它工作並找到矩形透明區域。
#!/usr/bin/ruby
require 'RMagick'
include Magick
infile=ARGV[0]
img = ImageList.new(infile)
w=img.columns
h=img.rows
#Extract alpha channel into pixel array
px=img.export_pixels(0,0,w,h,"A")
for row in 0..h-1
for col in 0..w-1
thispx=px[w*row+col]
if thispx<32768 then
a=row
b=col
# Find extent (c) of rectangle towards right
for r in col..w-1
thispx=px[w*row+r]
if thispx<32768
c=r
else
break
end
end
# Find extent (d) of rectangle towards bottom
for s in row..h-1
thispx=px[w*s+col]
if thispx<32768
d=s
else
break
end
end
# Blank this rectangle as we have located it
for r in row..d
for s in col..c
px[w*r+s]=65535
end
end
# Tell caller about this rectangle
printf "%d,%d %d,%d\n",a,b,d,c
end
end
end
運行這樣的:
bounds.rb input.png
- 1. Javascript方法來檢測不透明PNG的區域
- 2. 灰色區域W ImageMagick的 「-distort透視」 儘管透明的虛擬像素
- 3. 鼠標單擊檢測只在動畫片段的不透明區域
- 4. 透明PNG imagemagick passthru
- 5. 檢查座標是否在區域內
- 6. JWindow區域不透明
- 7. Android透明區域點擊
- 8. 座標在區域標記
- 9. 將不透明區域拉到圖像中透明區域的中心
- 10. imagemagick標題與半透明背景
- 11. PDFBox的PDFTextStripperByArea區域座標
- 12. ImageMagick的:用透明背景
- 13. 如何檢測明亮區域
- 14. 檢測與具有透明區域的影片剪輯的碰撞
- 15. HTML地圖區域座標
- 16. 在部分透明的圖像上點擊透明區域
- 17. 帶區域學習的標記檢測
- 18. Android - 如何檢測自定義形狀按鈕點擊區域的透明度
- 19. 使用ImageMagick檢測單色覆蓋區域
- 20. 刪除ImageView中的透明區域
- 21. Android/Eclipse:png圖像中的透明區域
- 22. 使位圖的區域變爲透明
- 23. 單擊圖像的透明區域
- 24. Matlab:透明物體檢測
- 25. PHP imagick檢測透明度
- 26. Opencv透明物體檢測
- 27. 使div區域透明,除了圖像所在的區域?
- 28. 檢測iphone區域
- 29. 使用php刪除透明區域(裁剪透明)使用php
- 30. 疊加層:半透明邊框,不透明內部區域 - howto
謝謝!這是一個非常好的幫助:) – user2139779 2014-10-09 20:44:56