ผลต่างระหว่างรุ่นของ "Image Pyramids"
Nobpadon (คุย | มีส่วนร่วม) (ยังไม่เสร็จ) |
Nobpadon (คุย | มีส่วนร่วม) |
||
แถว 7: | แถว 7: | ||
<br> | <br> | ||
เราสามารถหา Pyramids โดยใช้ฟังก์ชั่น cv2.pyrDown () และ cv2.pyrUp () | เราสามารถหา Pyramids โดยใช้ฟังก์ชั่น cv2.pyrDown () และ cv2.pyrUp () | ||
+ | <pre> | ||
+ | img = cv2.imread('messi5.jpg') | ||
+ | lower_reso = cv2.pyrDown(higher_reso) | ||
+ | </pre> | ||
+ | <div align="center">[[ไฟล์:Messipyr.jpg|420px|thumb|none|]]</div> | ||
+ | ---- | ||
+ | <pre> | ||
+ | higher_reso2 = cv2.pyrUp(lower_reso) | ||
+ | </pre> | ||
+ | โปรดจำไว้ว่า higher_reso2 ไม่เท่ากับ higher_reso เพราะเมื่อคุณลดความละเอียดคุณหลวมข้อมูล ภาพด้านล่างเป็น 3 ระดับลงพีระมิดที่สร้างขึ้นจากภาพที่มีขนาดเล็กที่สุดในกรณีที่ก่อนหน้านี้ เปรียบเทียบกับภาพต้นฉบับ | ||
+ | <div align="center">[[ไฟล์:Messiup.jpg|420px|thumb|none|]]</div> | ||
+ | ---- | ||
+ | Pyramids Laplacian จะเกิดขึ้นจากGaussian Pyramids ไม่มีฟังก์ชั่นพิเศษสำหรับ Pyramids Laplacian เป็นเหมือน edge images เท่านั้น ส่วนใหญ่ขององค์ประกอบที่เป็น 0 พวกเขาจะใช้ในการบีบอัดภาพ ระดับใน Laplacian Pyramids จะเกิดขึ้นโดยความแตกต่างระหว่างระดับว่าใน Gaussian Pyramids และรุ่นของและขนาดของบนสุด ของการขยายตัวในเกาส์ Pyramids สามระดับในระดับ Laplacian จะมีลักษณะเช่นด้านล่าง (ความคมชัดจะมีการปรับเพื่อเพิ่มเนื้อหา) | ||
+ | <div align="center">[[ไฟล์:Lap.jpg|420px|thumb|none|]]</div> | ||
+ | '''Image Blending using Pyramids ''' | ||
+ | <br> | ||
+ | หนึ่งโปรแกรมของ Pyramids เป็นภาพผสม ยกตัวอย่างเช่นในการรวมถาพ แต่มันอาจจะดูไม่ดีเนื่องจากการความเนียนระหว่างภาพ ในกรณีที่การผสมภาพที่มี Pyramids จะช่วยให้คุณอย่างกลมกลืนโดยไม่ต้องออกข้อมูลมากในภาพ หนึ่งในตัวอย่างคลาสสิกของที่นี่คือการผสมผสานของทั้งสองผลไม้ส้มและแอปเปิ้ล เห็นผลในขณะนี้ตัวเองจะเข้าใจสิ่งที่ฉันพูด | ||
+ | <div align="center">[[ไฟล์:Orapple.jpg|420px|thumb|none|]]</div> | ||
+ | <pre> | ||
+ | import cv2 | ||
+ | import numpy as np,sys | ||
+ | |||
+ | A = cv2.imread('apple.jpg') | ||
+ | B = cv2.imread('orange.jpg') | ||
+ | |||
+ | # สร้าง Gaussian pyramid ของ A | ||
+ | G = A.copy() | ||
+ | gpA = [G] | ||
+ | for i in xrange(6): | ||
+ | G = cv2.pyrDown(G) | ||
+ | gpA.append(G) | ||
+ | |||
+ | # สร้าง Gaussian pyramid ของ B | ||
+ | G = B.copy() | ||
+ | gpB = [G] | ||
+ | for i in xrange(6): | ||
+ | G = cv2.pyrDown(G) | ||
+ | gpB.append(G) | ||
+ | |||
+ | # สร้าง Laplacian Pyramid ของ A | ||
+ | lpA = [gpA[5]] | ||
+ | for i in xrange(5,0,-1): | ||
+ | GE = cv2.pyrUp(gpA[i]) | ||
+ | L = cv2.subtract(gpA[i-1],GE) | ||
+ | lpA.append(L) | ||
+ | |||
+ | # สร้าง Laplacian Pyramid ของ B | ||
+ | lpB = [gpB[5]] | ||
+ | for i in xrange(5,0,-1): | ||
+ | GE = cv2.pyrUp(gpB[i]) | ||
+ | L = cv2.subtract(gpB[i-1],GE) | ||
+ | lpB.append(L) | ||
+ | |||
+ | # เพิ่มครึ่งซ้ายและขวาของภาพในแต่ละระดับ | ||
+ | LS = [] | ||
+ | for la,lb in zip(lpA,lpB): | ||
+ | rows,cols,dpt = la.shape | ||
+ | ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:])) | ||
+ | LS.append(ls) | ||
+ | |||
+ | # now reconstruct | ||
+ | ls_ = LS[0] | ||
+ | for i in xrange(1,6): | ||
+ | ls_ = cv2.pyrUp(ls_) | ||
+ | ls_ = cv2.add(ls_, LS[i]) | ||
+ | |||
+ | # เชื่อมต่อโดยตรงแต่ละครึ่ง | ||
+ | real = np.hstack((A[:,:cols/2],B[:,cols/2:])) | ||
+ | |||
+ | cv2.imwrite('Pyramid_blending2.jpg',ls_) | ||
+ | cv2.imwrite('Direct_blending.jpg',real) | ||
+ | </pre> | ||
+ | ---- |
รุ่นแก้ไขเมื่อ 09:11, 5 สิงหาคม 2559
วัตถุประสงค์
- เราจะได้เรียนรู้เกี่ยวกับ Pyramids
- เราจะเห็นฟังก์ชั่นเหล่านี้ cv2.pyrUp () cv2.pyrDown ()
ปกติเราใช้ในการทำงานที่มีภาพของขนาดคงที่ แต่ในบางโอกาสเราต้องทำงานกับภาพความละเอียดที่แตกต่างกันของภาพเดียวกัน ยกตัวอย่างเช่นขณะที่การค้นหาบางสิ่งบางอย่างในภาพเช่นใบหน้าเราไม่แน่ใจว่าสิ่งที่ขนาดวัตถุที่จะนำเสนอในภาพ ในกรณีที่เราจะต้องสร้างชุดของภาพที่มีความละเอียดที่แตกต่างกันและค้นหาวัตถุในภาพทั้งหมด ชุดนี้ของภาพที่มีความละเอียดที่แตกต่างกันจะเรียกว่าภาพ Pyramids (เพราะเมื่อพวกเขาจะถูกเก็บไว้ใน stack ที่มีภาพที่ยิ่งใหญ่ที่สุดที่ด้านล่างและภาพที่มีขนาดเล็กที่สุดที่ดูด้านบนเหมือนปิรามิด)
เราสามารถหา Pyramids โดยใช้ฟังก์ชั่น cv2.pyrDown () และ cv2.pyrUp ()
img = cv2.imread('messi5.jpg') lower_reso = cv2.pyrDown(higher_reso)
higher_reso2 = cv2.pyrUp(lower_reso)
โปรดจำไว้ว่า higher_reso2 ไม่เท่ากับ higher_reso เพราะเมื่อคุณลดความละเอียดคุณหลวมข้อมูล ภาพด้านล่างเป็น 3 ระดับลงพีระมิดที่สร้างขึ้นจากภาพที่มีขนาดเล็กที่สุดในกรณีที่ก่อนหน้านี้ เปรียบเทียบกับภาพต้นฉบับ
Pyramids Laplacian จะเกิดขึ้นจากGaussian Pyramids ไม่มีฟังก์ชั่นพิเศษสำหรับ Pyramids Laplacian เป็นเหมือน edge images เท่านั้น ส่วนใหญ่ขององค์ประกอบที่เป็น 0 พวกเขาจะใช้ในการบีบอัดภาพ ระดับใน Laplacian Pyramids จะเกิดขึ้นโดยความแตกต่างระหว่างระดับว่าใน Gaussian Pyramids และรุ่นของและขนาดของบนสุด ของการขยายตัวในเกาส์ Pyramids สามระดับในระดับ Laplacian จะมีลักษณะเช่นด้านล่าง (ความคมชัดจะมีการปรับเพื่อเพิ่มเนื้อหา)
Image Blending using Pyramids
หนึ่งโปรแกรมของ Pyramids เป็นภาพผสม ยกตัวอย่างเช่นในการรวมถาพ แต่มันอาจจะดูไม่ดีเนื่องจากการความเนียนระหว่างภาพ ในกรณีที่การผสมภาพที่มี Pyramids จะช่วยให้คุณอย่างกลมกลืนโดยไม่ต้องออกข้อมูลมากในภาพ หนึ่งในตัวอย่างคลาสสิกของที่นี่คือการผสมผสานของทั้งสองผลไม้ส้มและแอปเปิ้ล เห็นผลในขณะนี้ตัวเองจะเข้าใจสิ่งที่ฉันพูด
import cv2 import numpy as np,sys A = cv2.imread('apple.jpg') B = cv2.imread('orange.jpg') # สร้าง Gaussian pyramid ของ A G = A.copy() gpA = [G] for i in xrange(6): G = cv2.pyrDown(G) gpA.append(G) # สร้าง Gaussian pyramid ของ B G = B.copy() gpB = [G] for i in xrange(6): G = cv2.pyrDown(G) gpB.append(G) # สร้าง Laplacian Pyramid ของ A lpA = [gpA[5]] for i in xrange(5,0,-1): GE = cv2.pyrUp(gpA[i]) L = cv2.subtract(gpA[i-1],GE) lpA.append(L) # สร้าง Laplacian Pyramid ของ B lpB = [gpB[5]] for i in xrange(5,0,-1): GE = cv2.pyrUp(gpB[i]) L = cv2.subtract(gpB[i-1],GE) lpB.append(L) # เพิ่มครึ่งซ้ายและขวาของภาพในแต่ละระดับ LS = [] for la,lb in zip(lpA,lpB): rows,cols,dpt = la.shape ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:])) LS.append(ls) # now reconstruct ls_ = LS[0] for i in xrange(1,6): ls_ = cv2.pyrUp(ls_) ls_ = cv2.add(ls_, LS[i]) # เชื่อมต่อโดยตรงแต่ละครึ่ง real = np.hstack((A[:,:cols/2],B[:,cols/2:])) cv2.imwrite('Pyramid_blending2.jpg',ls_) cv2.imwrite('Direct_blending.jpg',real)