คุณไม่จำเป็นต้อง ค้นหาภาพย่อย เพื่อให้บรรลุเป้าหมาย ปัญหาสามารถลดลงเหลือเพียง การแยกวิเคราะห์ข้อความ
1. พื้นฐาน
ลองพิจารณาสิ่งนี้: คุณสามารถบอกให้ ImageMagick แปลงรูปภาพใดๆ ให้เป็นการแสดงข้อความ ซึ่งจะเก็บข้อมูลสีที่แน่นอนสำหรับแต่ละพิกเซล ตัวอย่าง:
convert wizard: textwizard.txt
(wizard:
เป็นอิมเมจในตัวสำหรับการติดตั้ง ImageMagick ทั้งหมดเพื่อการทดสอบ)
ใช่ มันง่ายมาก! ขอ "รูปแบบ" รูปภาพนี้โดยเพิ่มส่วนต่อท้าย .txt
ผลลัพธ์:
# ImageMagick pixel enumeration: 480,640,255,srgb
0,0: (255,255,255) #FFFFFF white
1,0: (255,255,255) #FFFFFF white
2,0: (255,255,255) #FFFFFF white
[....]
47,638: (246,247,249) #F6F7F9 srgb(246,247,249)
48,638: (246,247,249) #F6F7F9 srgb(246,247,249)
47,639: (236,235,236) #ECEBEC srgb(236,235,236)
48,639: (230,228,218) #E6E4DA srgb(230,228,218)
[....]
476,639: (255,255,255) #FFFFFF white
477,639: (255,255,255) #FFFFFF white
478,639: (255,255,255) #FFFFFF white
479,639: (255,255,255) #FFFFFF white
หากคุณดูที่บรรทัดแรกของผลลัพธ์ คุณจะสังเกตเห็นว่า ImageMagick ใช้เพื่อดูรายละเอียดข้อมูลพิเศษบางอย่างเกี่ยวกับรูปภาพที่นี่:
# ImageMagick pixel enumeration: 480,640,255,srgb
มันหมายความว่า:
- ภาพมีความกว้าง 480 พิกเซล
- ภาพมีความสูง 640 พิกเซล
- รูปภาพใช้ช่วง 0-255 สำหรับข้อมูลสีต่อช่อง (ซึ่งเทียบเท่ากับความลึกของสี 8 บิต)
- รูปภาพถูกสร้างขึ้นในพื้นที่สี sRGB
บรรทัดอื่นๆ ประกอบด้วย 4 คอลัมน์:
- คอลัมน์แรกในรูปแบบ
(N,M)
ระบุตำแหน่งที่แน่นอนของพิกเซลตามลำดับเป็น (row_number,column_number)
(ดัชนีสำหรับหมายเลขแถวและคอลัมน์เป็นแบบศูนย์ -- แถวที่ 1 ระบุเป็น 0
, ลำดับที่ 2 เป็น 1
)
- อีกสามคอลัมน์ที่เหลือซ้ำซ้อน แต่ละคอลัมน์เก็บข้อมูลเดียวกันทุกประการ แต่ละคอลัมน์ใช้สัญกรณ์ที่แตกต่างกัน: ค่าสีที่แน่นอนสำหรับพิกเซลที่กำหนดในคอลัมน์ 1 (คอลัมน์สุดท้ายจะใช้ชื่อที่มนุษย์สามารถอ่านได้หาก ImageMagick รู้จัก สำหรับค่าสีนั้น...)
ตามหมายเหตุด้านข้าง: คุณสามารถใช้การแสดงข้อความของรูปภาพต้นฉบับ (โดยมีหรือไม่มีการแก้ไขเพิ่มเติมบางอย่าง) เพื่อสร้างรูปภาพจริงขึ้นมาใหม่:
convert textwizard.txt wizard.jpg
ย่อย>
2. เลือกแถวที่ต้องการ
คุณควรทราบว่าคุณสามารถเลือกพื้นที่เฉพาะของรูปภาพโดยใช้ไวยากรณ์ต่อไปนี้:
image.png[WIDTHxHEIGHT+X_OFFSET+Y_OFFSET]
ดังนั้นหากต้องการเลือกเฉพาะแถว คุณสามารถตั้งค่า HEIGHT
เป็น 1
ได้ หากต้องการให้แถวใดแถวหนึ่งสมบูรณ์ ให้ตั้งค่า X-OFFSET
เป็น 0
หากต้องการรับแถวที่ต้องการ ให้ตั้งค่า Y-OFFSET
ตามนั้น
เพื่อให้ได้ค่า (สำหรับอิมเมจบิวด์อิน wizard:
ที่ใช้ด้านบน) สำหรับแถวที่มีดัชนี 47 เราสามารถทำได้:
convert wizard:[640x1+0+47] row47.txt
cat row47.txt
# ImageMagick pixel enumeration: 480,1,255,srgb
0,0: (255,255,255) #FFFFFF white
1,0: (255,255,255) #FFFFFF white
2,0: (255,255,255) #FFFFFF white
[....]
428,0: (82,77,74) #524D4A srgb(82,77,74)
429,0: (169,167,168) #A9A7A8 srgb(169,167,168)
430,0: (232,231,228) #E8E7E4 srgb(232,231,228)
432,0: (246,247,249) #F6F7F9 srgb(246,247,249)
[....]
476,0: (255,255,255) #FFFFFF white
477,0: (255,255,255) #FFFFFF white
478,0: (255,255,255) #FFFFFF white
479,0: (255,255,255) #FFFFFF white
หากคุณไม่ต้องการเอาต์พุตข้อความในไฟล์ แต่พิมพ์บนช่องเอาต์พุตมาตรฐาน คุณสามารถทำได้ดังนี้:
convert wizard:[480x1+0+47] txt:-
3. เย็บทั้งหมดเข้าด้วยกัน
จากข้อมูลข้างต้น แนวทางที่สามารถนำมาใช้กับงานนี้ได้มีความชัดเจน:
- วนซ้ำแถวพิกเซลทั้งหมดของรูปภาพ
- ส่งออกค่าสีของแต่ละพิกเซลเป็นข้อความ
- มองหาพิกเซลแรกที่ไม่ใช่สีขาวและเก็บข้อมูลตำแหน่งไว้
4. สคริปต์ที่เป็นไปได้ (OS X, Linux, Unix)
นี่คือส่วนหลักของสคริปต์ Bash ที่สามารถใช้ได้:
# Define some image specific variables (width, height, ...)
image=${1}
number_of_columns=$(identify -format '%W' ${image})
width=${number_of_columns} # just an alias
number_of_rows=$(identify -format '%H' ${image})
height=${number_of_rows} # just an alias
max_of_indices=$(( ${height} -1 ))
# Loop through all rows and grep for first non-white pixel
for i in $(seq 0 ${max_of_indices}); do
echo -n "Row ${i} : " ;
convert ${image}[${width}x1+0+${i}] txt:- \
| grep -v enumeration \
| grep -v '#FFFFFF' -m 1 \
|| echo "All WHITE pixels in row!"
done
-v white
จะยกเลิกการเลือกบรรทัดทั้งหมดที่มีสตริง white
พารามิเตอร์ -m 1
จะคืนค่าการจับคู่สูงสุด 1 รายการ (เช่น รายการแรก)
มันจะช้าแต่จะทำงาน
person
Kurt Pfeifle
schedule
05.03.2015