resize + unsharp-mask little by little

พี่แสนเคยบอกไว้มานานแล้วว่า เวลาย่อรูปเนี่ยเราไม่ควรย่อลงไปให้ได้ขนาดในทันที เช่น จาก 100% ไปเป็น 50% เราคววรจะแบ่งการย่อทีละนิดๆจาก 100% ไปเป็น 75% แล้วค่อยย่อจาก 75% ให้ได้ 50% หลังการย่อแต่ละครั้งให้ทำ unsharp-mask ด้วยจะทำให้ภาพคมขึ้นและดูสวยงาม
My brother SAN told me long time, when I have to resize, I should not resize to aspect ratio immediately such as 100% to 50%. I have to resize little by little from 100% to 75% then resize from 75% to 50 . Then after each resize process, it should be applied unsharp-mask filter. I will make more sharpen.
ผมก็เลยเขียนเพิ่มให้มันเป็นการแบ่งครั้งที่จะทำการ resize ได้ดังนี้
SHARPEN.times do nphoto = photo.resize(NEWSIZE**(1.0/SHARPEN)) photo = nphoto.unsharp_mask end
ดูได้จากภาพตัวอย่าง ได้ที่ multiply
[...]
Published on Wed, 10 Sep 2008 16:01
0 comments

Ruby Fork

จากครั้งที่แล้วผมอยากจะเขียน ruby สักอันไว้ทำการ stamp ลายเซ็นพร้อมค่า exif ลงในรูป จากการลองเขียนเป็น thread แล้วปรากฏว่าไม่ค่อยมีประโยชน์เท่าไหร่กลับกลายเป็นว่ามี overhead ขึ้นมาเพียบและก็ทำงานไม่ครบได้ทุก core ที่มี งานส่วนใหญ่ในการทำงานเกี่ยวกับภาพนี่จะเป็นในด้านคำนวนซะเยอะ เลยเขียนเป็นลักษณะ fork ออกมาจะดีกว่า
พอลองได้เขียนก็ได้แนวคิดมา 2 แบบ คือ
  • ทำงานแบบเป็น lot คือทำพร้อมกันที่ละเท่าๆกัน แล้วรอให้เสร็จหมด ค่อยเริ่ม lot ต่อไป แบบนี้ถ้ามี process ใน lot เสร็จก่อนเพื่อนก็ต้องรอ
  • แบบที่สองคือเริ่มทำงานให้เต็มตามที่เรากำหนด ถ้า process ไหนเสร็จก่อนก็เอา process ใหม่มา run ได้เลย แบบนี้จะทำให้การทำงานต่อเนื่อง
แบบนี้คือการทำงานแบบเป็น Lot NUMFORK = 2 getImg = Dir['*.jpg','*.JPG','*.Jpg','*.jpeg'].sort.reverse Dir.mkdir("stamped") if !File.exist?("stamped") numFork = 0 while !getImg.empty? numFork = numFork + 1 photo = getImg.pop Process.fork{stampit(photo)} if numFork == NUMFORK Process.waitall numFork = 0 end end Process.waitall ส่วนแบบนี้คือการทำงานแบบต่อเนื่อง NUMFORK = 2 getImg = Dir['*.jpg','*.JPG','*.Jpg','*.jpeg'].sort.reverse Dir.mkdir("stamped") if !File.exist?("stamped") numFork = 0 while !getImg.empty? numFork = numFork + 1 photo = getImg.pop Process.fork{stampit(photo)} if numFork >= NUMFORK Process.wait numFork = numFork - 1 end end Process.waitall อย่างนี้ก็สบายใช้งานคุ้มทุก core[...]
Published on Thu, 04 Sep 2008 16:29
0 comments

RSS