- 1. การแปลงภาพ - การแปลงแบบ Affine และ Non-Affine
- 2. การแปลรูปภาพ - การเลื่อนภาพขึ้นลงซ้ายและขวา
- 3. การหมุนภาพ - การหมุนภาพ
- 4. การปรับขนาดการปรับขนาดและการแก้ไข
- 5. ปิรามิดรูปภาพ - อีกวิธีหนึ่งในการปรับขนาด
- 6. การครอบตัด - ตัดขอบเขตภาพที่คุณต้องการ
- 7. การคำนวณทางคณิตศาสตร์เพื่อเพิ่มความสว่างและมืดของภาพ
ในการกวดวิชาก่อนหน้านี้เราได้เรียนรู้เกี่ยวกับ OpenCV และทำภาพขั้นพื้นฐานบางอย่างในการประมวลผลโดยใช้มันเหมือนการปรับสีเทาความอิ่มตัวของสี, histogram พื้นที่สี RGB ส่วนประกอบอื่น ๆ เช่นบอกว่าในการกวดวิชาก่อนหน้านี้OpenCV เป็น Open Source พร็อพวิสัยทัศน์ห้องสมุดซึ่งมี อินเตอร์เฟส C ++, Python และ Java และรองรับ Windows, Linux, Mac OS, iOS และ Android ดังนั้นจึงสามารถติดตั้งได้อย่างง่ายดายใน Raspberry Pi ด้วยสภาพแวดล้อม Python และ Linux และ Raspberry Pi พร้อม OpenCV และกล้องที่ติดมาสามารถใช้เพื่อสร้างแอปพลิเคชันการประมวลผลภาพแบบเรียลไทม์มากมายเช่นการตรวจจับใบหน้าการล็อกใบหน้าการติดตามวัตถุการตรวจจับป้ายทะเบียนรถยนต์ระบบรักษาความปลอดภัยภายในบ้าน
ในบทช่วยสอนนี้เราจะมาดูว่าเราจะจัดการภาพโดยใช้ OpenCVอย่างไร ที่นี่เราจะเรียนรู้การใช้ฟังก์ชันต่อไปนี้กับรูปภาพโดยใช้ OpenCV:
- การแปลงภาพ - การแปลงแบบ Affine และ Non-Affine
- การแปลรูปภาพ - การเลื่อนภาพขึ้นลงซ้ายและขวา
- การหมุนภาพ - การหมุนภาพ
- การปรับขนาดการปรับขนาดและการแก้ไข
- Image Pyramids - อีกวิธีหนึ่งในการปรับขนาด
- การครอบตัด - การตัดขอบเขตภาพที่คุณต้องการ
- การคำนวณทางคณิตศาสตร์เพื่อเพิ่มความสว่างและมืดของภาพ
1. การแปลงภาพ - การแปลงแบบ Affine และ Non-Affine
การแปลงรูปเป็นการบิดเบือนทางเรขาคณิตที่เกิดขึ้นกับรูปภาพการบิดเบือนในที่นี้ไม่ได้หมายถึงความผิดพลาด แต่เป็นการแก้ไขประเภทเพื่อแก้ไขปัญหามุมมองที่เกิดจากจุดที่จับภาพ การแปลงภาพมีสองประเภทได้แก่ Affine และ Non-Affine
การแปลง Affineมีสามประเภทการปรับขนาดการหมุนและการแปลสิ่งสำคัญในการแปลงแบบ Affineคือเส้นจะขนานกันก่อนและหลังการแปลงภาพ
การแปลงที่ไม่ใช่ Affineหรือการแปลงแบบโพรเจกไทล์ไม่ได้รักษาความขนานความยาวหรือมุมอย่างไรก็ตามมันจะรักษา collinearity และ incidence collinearity หมายความว่าจุดทั้งสองอยู่บนเส้นตรงเดียวกัน
การเปลี่ยนแปลงที่ไม่ใช่ Affine เป็นเรื่องปกติมากในการมองเห็นของคอมพิวเตอร์และเกิดจากมุมกล้องที่แตกต่าง Non-เลียนแบบหรือ projective แปลงยังเรียกhomography
2. การแปลรูปภาพ - การเลื่อนภาพขึ้นลงซ้ายและขวา
การแปลรูปภาพเป็นการย้ายรูปภาพขึ้นลงซ้ายและขวาและแม้กระทั่งในแนวทแยงหากเราใช้การแปล x และ y พร้อมกัน
ตอนนี้สำหรับการดำเนินการแปลภาพที่เราใช้ฟังก์ชั่น warpAffine OpenCV ของ cv2.warpAffine ถูกนำมาใช้ในการดำเนินการแปลเหล่านี้แต่การที่เราต้องเมทริกซ์การแปล
เมทริกซ์แปล, T = 1 0 Tx
0 1 ty
T X, T yคือทิศทางที่เกิดการเลื่อนของภาพ
โดย T Xจะเลื่อนไปตามแกน X (แนวนอน)
T Yถูกเลื่อนไปตามแกน Y (แนวตั้ง)
# นี่คือการเปลี่ยนแปลงที่เกี่ยวข้องเพียงแค่เปลี่ยนตำแหน่งของรูปภาพ # เราใช้ cv2.warpAffine เพื่อใช้การเปลี่ยนแปลงเหล่านี้ import cv2 import numpy เป็น np image = cv2.imread ('input.jpg') # เก็บความสูงและความกว้างของ ความสูง ของรูปภาพ width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (รูปภาพ, T, (กว้าง, สูง)) พิมพ์ (T) cv2.imshow ('original_image', รูปภาพ) cv2.waitKey (0) cv2.imshow (' การแปล ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
เอาต์พุตคอนโซล - (183, 275) - ความสูงและความกว้าง
- T เมทริกซ์
]
3. การหมุนภาพ - การหมุนภาพ
การหมุนภาพเป็นการหมุนภาพโดยเกี่ยวกับจุดหรือจุดที่อยู่ตรงกลางภาพเช่นเดียวกับที่จุดหมุนจะทำหน้าที่เหมือนเดือย
เช่นเดียวกับในการแปลเรามีเมทริกซ์ T ซึ่งในการหมุนเรามีเมทริกซ์ M
เมทริกซ์การหมุนเมทริกซ์ M = Cosθ-Sinθ
SinθCosθ
โดยที่θคือมุมของการหมุนซึ่งวัดในทิศทางทวนเข็มนาฬิกา
นอกจากนี้ยังมีสิ่งหนึ่งที่ควรทราบว่า OpenCV ช่วยให้คุณสามารถขายและหมุนภาพได้ในเวลาเดียวกันโดยใช้ฟังก์ชัน cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, มุมการหมุน, มาตราส่วน)
เรายังคงใช้ฟังก์ชัน warpAffine ของ opencv เพื่อรับการหมุนของภาพแต่แทนที่จะเป็นเมทริกซ์การแปลเหมือนในกรณีก่อนหน้านี้เราใช้เมทริกซ์การหมุน
นำเข้า cv2 นำเข้า numpy เป็น np image = cv2.imread ('input.jpg') height, width = image.shape # หารความสูงและความกว้าง 2 เพื่อหมุนรูปภาพเกี่ยวกับ center rotation_matrix = cv2.getRotationMatrix2D ((width / 2, height / 2), 90,1) rotated_image = cv2.warpAffine (รูปภาพ, rotation_matrix, (กว้าง, สูง)) cv2.imshow ('ภาพต้นฉบับ', รูปภาพ) cv2.waitKey (0) cv2.imshow ('ภาพที่หมุน ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
ตอนนี้ภาพหมุนไป 90 องศาแล้วภาพจะถูกครอบตัดเนื่องจากขนาดผ้าใบเนื่องจากขนาดผ้าใบยังคงเท่าเดิม แต่เนื่องจากขนาดภาพการหมุนไม่พอดีกับขนาดผ้าใบ สามารถปรับได้โดยการตั้งค่าปัจจัยการปรับขนาดเป็นลบ แต่จะให้พื้นหลังสีดำด้านหลังภาพ
ดังนั้นคุณสามารถตั้งค่าความสูงและความกว้างของภาพได้โดยการคาดเดาหรือคาดเดาหรือมีวิธีอื่นในการหมุนภาพคือการเปลี่ยนภาพแต่จะหมุนภาพโดยการทวีคูณ 90 องศาในทิศทางทวนเข็มนาฬิกา
4. การปรับขนาดการปรับขนาดและการแก้ไข
การปรับขนาดและการปรับขนาดเป็นการแปลงแบบดึงดูดการปรับขนาดภาพเป็นสิ่งที่เราทำมาแล้วพอสมควรและเราได้จัดการกับการแก้ไขด้วยเช่นเมื่อคุณปรับขนาดภาพให้มีขนาดใหญ่ขึ้นซึ่งเรากำลังขยายพิกเซลจะมีช่องว่างบางส่วนใน พิกเซลและนั่นคือจุดที่การแก้ไขเข้ามา
สามารถเกิดขึ้นได้กับการเพิ่มขนาดภาพจากเล็กไปใหญ่หรือลดขนาดภาพจากใหญ่ไปเล็ก
ในทางเทคนิคการแก้ไขเป็นวิธีการสร้างจุดข้อมูลใหม่ (พิกเซล) ภายในชุดจุดข้อมูลที่รู้จักแบบแยกส่วน
มีวิธีการแก้ไขหลายประเภทใน OpenCV เช่น
cv2.INTER_AREA - เหมาะสำหรับการลดขนาดหรือลดการสุ่มตัวอย่าง
cv2.INTER_NEAREST - เร็วที่สุด
cv2.LINEAR - เหมาะสำหรับการซูมหรือขึ้นการสุ่มตัวอย่าง (ค่าเริ่มต้น)
cv2.CUBIC - ดีกว่า
cv2.INTER_LANCZOS4 - ดีที่สุด
# การปรับขนาดทำได้ง่ายมากโดยใช้ฟังก์ชัน cv2.resize อาร์กิวเมนต์คือ # cv2.resize (image, dsize (ขนาดภาพที่ส่งออก), x_scale, y_scale, interpolation) import cv2 import numpy เป็น np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # มาสร้างภาพ 3/4 ของขนาดภาพต้นฉบับเช่นลดขนาดลงเป็น 75% image_scaled = cv2.resize (image, None, fx = 0.75, fy = 0.75) #s เนื่องจากการแก้ไขเชิงเส้นเป็นวิธีเริ่มต้นสำหรับ cv แบบเปิดเราจึงไม่จำเป็นต้องใช้มันเป็นฟังก์ชัน cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # ขอเพิ่มขนาดรูปภาพของเราเป็นสองเท่า img_double = cv2.resize (รูปภาพ, ไม่มี, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # มาทำการปรับขนาดตามขนาดที่แน่นอน image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact' image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. ปิรามิดรูปภาพ - อีกวิธีหนึ่งในการปรับขนาด
ภาพ Pyramiding หมายถึงการขยายขนาด (การขยายภาพ) หรือการลดขนาด (การย่อขนาดภาพ)
เป็นเพียงวิธีการปรับขนาดที่แตกต่างกันซึ่งช่วยให้เราสามารถปรับขนาดภาพได้อย่างง่ายดายและรวดเร็วโดยการลดขนาดจะลดความสูงและความกว้างของรูปภาพใหม่ลงครึ่งหนึ่ง
สิ่งนี้มีประโยชน์เมื่อสร้างเครื่องตรวจจับวัตถุที่ปรับขนาดภาพทุกครั้งที่มองหาวัตถุ
นำเข้า ภาพ cv2 = cv2.imread ('input.jpg') เล็กกว่า = cv2.pyrDown (ภาพ) ใหญ่ขึ้น = cv2.pyrUp (เล็กกว่า) cv2.imshow ('ต้นฉบับ', รูปภาพ) cv2.waitKey (0) cv2.imshow ('เล็กกว่า' เล็กกว่า) cv2.waitKey (0) cv2.imshow ('ใหญ่กว่า' ใหญ่กว่า) cv2.waitKey (0) cv2.destroyAllWindows ()
ในภาพขนาดใหญ่คุณจะสังเกตเห็นว่ายังคงมีขนาดเท่ากันของภาพต้นฉบับ แต่ภาพจะเบลอเล็กน้อยเนื่องจากถูกแปลงจากภาพขนาดเล็กไปเป็นภาพขนาดใหญ่โดยตรง แต่ถ้าเราแก้ไขคุณภาพของภาพจะดีขึ้นเมื่อเทียบกับก่อนหน้านี้เนื่องจากการแก้ไขจะประเมินพิกเซลในขณะที่เติมช่องว่างเมื่อขยายภาพ
ตอนนี้ใช้รหัสเดียวกัน แต่ด้วยการแก้ไขลูกบาศก์ให้คุณภาพของภาพขนาดใหญ่ที่ดีขึ้น ภาพด้านล่างแสดงการเปรียบเทียบระหว่างภาพต้นฉบับภาพขนาดใหญ่ขึ้นภาพขนาดเล็กและภาพขนาดเล็กที่มีการแก้ไขลูกบาศก์
นำเข้า ภาพ cv2 = cv2.imread ('input.jpg') เล็กกว่า = cv2.pyrDown (ภาพ) ใหญ่ขึ้น = cv2.pyrUp (เล็กกว่า) cv2.imshow ('ต้นฉบับ', รูปภาพ) cv2.waitKey (0) cv2.imshow ('เล็กกว่า' เล็กกว่า) cv2.waitKey (0) cv2.imshow ('ใหญ่กว่า' ใหญ่กว่า) cv2.waitKey (0) # เพิ่มคุณภาพของภาพขนาดใหญ่ที่แปลงแล้วจากภาพขนาดเล็กโดยใช้การแก้ไขลูกบาศก์ img_double = cv2.resize (เล็กกว่า, ไม่มี, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
หมายเหตุ: หากคุณต้องการที่จะสร้างสำเนาขนาดเล็กหลายภาพจะมีขนาดเล็กและขนาดเล็กหรือขนาดใหญ่หลายสำเนาของภาพที่เติบโตอย่างต่อเนื่องในขนาดที่แล้วเราสามารถใช้ สำหรับ ลูปหรือ ในขณะที่ ลูปการรักษาภายใน pyrDown หรือ pyrUp ฟังก์ชั่น
6. การครอบตัด - ตัดขอบเขตภาพที่คุณต้องการ
การครอบตัดรูปภาพหมายถึงการแยกส่วนของภาพ
OpenCV โดยตรงไม่ได้มีฟังก์ชั่นการปลูกพืช แต่ก็สามารถทำได้อย่างง่ายดายโดย numpy ใช้รหัสด้านล่าง
ครอบตัด = รูปภาพ
เราใส่อาร์เรย์รูปภาพและใช้เครื่องมือหรือวิธีการจัดทำดัชนีเป็นตัวเลขเรากำหนดแถวเริ่มต้นไปยังแถวท้ายและคอลัมน์เริ่มต้นถึงคอลัมน์สิ้นสุดคั่นด้วยเครื่องหมายจุลภาคที่แยกสี่เหลี่ยมที่เราต้องการครอบตัดเพื่อให้ได้ภาพ
นำเข้า cv2 นำเข้า numpy เป็น np image = cv2.imread ('input.jpg') height, width = image.shape # ขอพิกัดพิกเซลเริ่มต้น (ด้านซ้ายบนของรูปสี่เหลี่ยมครอบตัด) start_row, start_col = int (height *.25), int (width *.25) # ขอพิกัดพิกเซลสิ้นสุด (ล่างขวา) end_row, end_col = int (height *.75), int (width *.75) #simply ใช้การจัดทำดัชนีเพื่อครอบตัดสี่เหลี่ยมที่เราต้องการให้ ครอบตัด = ภาพ cv2.imshow ("ภาพต้นฉบับ", ภาพ) cv2.waitKey (0) cv2.imshow ("ภาพที่ครอบตัด", ครอบตัด) cv2.waitKey (0) cv2.destroyAllWindows ()
โปรดทราบ ว่าคุณสามารถใช้ค่าพิกเซลได้โดยตรงแทน start_col หรือ start_row ซึ่งมีไว้เพื่อระบุตัวตนที่ง่ายสำหรับผู้ใช้
7. การคำนวณทางคณิตศาสตร์เพื่อเพิ่มความสว่างและมืดของภาพ
การคำนวณทางคณิตศาสตร์ใน OpenCV โดยทั่วไปคือการเพิ่มหรือลบเมทริกซ์ให้กับภาพการเพิ่มหรือการลบเมทริกซ์มีผลต่อการเพิ่มหรือลดความสว่าง
ดังนั้นในการเพิ่มหรือลบเมทริกซ์เราต้องสร้างมันขึ้นมาและ numpy มีฟังก์ชันที่เรียกว่า np.ones ที่ให้เมทริกซ์ที่มีขนาดเท่ากับ 1 ของภาพของเรา
import cv2 import numpy เป็น np image = cv2.imread ('input.jpg') # สร้างเมทริกซ์ของตัวเองจากนั้นคูณด้วย scaler ของ 100 ' # np.ones จะให้เมทริกซ์ที่มีมิติเดียวกับรูปภาพของเราด้วยทั้งหมด ค่าเป็น 100 ในกรณีนี้ M = np.ones (image.shape, dtype = "uint8") * 100 # เราใช้สิ่งนี้เพื่อเพิ่มเมทริกซ์ M นี้ให้กับรูปภาพของเรา # สังเกตการเพิ่มความสว่างที่ เพิ่ม = cv2.add (รูปภาพ, M) cv2.imshow ("เพิ่ม", เพิ่ม) cv2.waitKey (0) # ในทำนองเดียวกันเรายังสามารถ แทนที่ # สังเกตการลดลงของความสว่าง ลบ = cv2.subtract (ภาพ, M) cv2.imshow ("ลบ", ลบ) cv2.waitKey (0) cv2.destroyAllWindows ()
นี่คือวิธีที่สามารถใช้ OpenCV เพื่อใช้การประมวลผลภาพต่างๆกับภาพ เราจะดำเนินการกับฟังก์ชันการปรับแต่งภาพอื่น ๆ ในบทช่วยสอนถัดไป