การประมาณหาพื้นที่

https://www.wolframcloud.com/obj/sompob/Published/estimatearea.nb

พอดีมีคนถามว่าจะหาพื้นที่แรเงาได้อย่างไรที่

http://topicstock.pantip.com/wahkor/topicstock/2011/07/X10848195/X10848195.html

ซึ่งวิธีหาพื้นที่นี้สามารถคำนวณได้จากการอาศัยความสัมพันธ์ของพื้นที่สี่เหลี่ยมและวงกลมครับ แต่ผมจะเสนออีกวิธีหนึ่ง ซึ่งเป็นวิธีที่เรียกว่า Monte Carlo ครับ จากรูปเราอาจประมาณได้ว่า
(พื้นที่ที่ต้องการ / พื้นที่สี่เหลี่ยม(หนึ่งหน่วย) ) มีค่าประมาณ (จำนวนจุดในพื้นที่ที่ต้องการ / จำนวนจุดในพื้นที่สี่เหลี่ยม)
ดังนั้น พื้นที่ที่ต้องการ มีค่าประมาณ (จำนวนจุดในพื้นที่ที่ต้องการ / จำนวนจุดในพื้นที่สี่เหลี่ยม)

จากสูตรที่ได้นี้จะเห็นว่าถ้ายิ่งมีจำนวนจุดมากก็จะทำให้ค่าประมาณมีความละเอียดแม่นยำมากขึ้น และในตัวอย่างนี้จำนวนจุดที่ผมใช้ก็เอามาจากจำนวนจุดของภาพ(pixel)ครับ

ดังนั้นการหาจุดในพื้นที่ที่ต้องการนั้นก็เพียงนับจุดที่มีสีตรงกับสีที่ถูกทาไว้

ด้านล่างนี้เป็น Mathematica codes ที่ผมใช้ในการคำนวณครับ
โหลดภาพจากpantip.com
pic= Import[“http://topicstock.pantip.com/wahkor/topicstock/2011/07/X10848195/X10848195-0.jpg“];

crop เอาส่วนขอบออกโดยภาพที่ได้จะมีขนาด 380×380
croppic=ImageCrop[pic,{380,380}];

ดังนั้นจำนวนจุดทั้งหมดในสี่เหลี่ยมเท่ากับ 380^2
coorls =Table[{i, j}, {i, 1, 380}, {j, 1, 380}] // Flatten[#, 1] &;

จำนวนจุดที่อยู่ในพื้นที่ที่ต้องการก็คือจุดที่มีสี RGB เท่ากับ 0-0-254
ninside = Select[ImageValue[croppic, #, “Byte”] & /@ coorls, # =={ 0,0,254} &] // Length;

แต่ยังมีจุดที่อยู่บนขอบอีก
nedge=Select[ImageValue[croppic, #, “Byte”] & /@ coorls, # != {0, 0, 254} && # != {0, 0, 0} &] // Length;

ผมประมาณเอาว่าจุดที่เป็นขอบนี้เป็นส่วนของพื้นที่ที่ต้องการประมาณ 20% ดังนั้น พื้นที่ที่ต้องการประมาณ
(ninside + 0.2*nedge)/Length@coorls
0.146298

ลองเปรียบเทียบกับที่คำนวณจากสูตรโดยตรงดูนะครับ 🙂

แต่ถ้าจะใช้ Mathematica คำนวณพื้นที่ที่ว่าให้เลยก็ง่ายนิดเดียวครับ เพียงแค่ใช้คำสั่ง RegionDifference

Area@RegionDifference[Disk[{0.5, 0.5}, 0.5], Disk[{1, 0}, 1]]

0.146381

https://www.wolframcloud.com/obj/sompob/Published/estimatearea.nb

%d bloggers like this: