- รูปภาพคืออะไร?
- คอมพิวเตอร์เก็บภาพอย่างไร
- เหตุใดเครื่องจึงระบุภาพได้ยาก
- การใช้งานและการใช้ OpenCV
- การติดตั้ง OpenCV ด้วย Python และ Anaconda
- การเปิดและบันทึกภาพใน OpenCV
- ภาพสเกลสีเทาใน OpenCV
- ช่องว่างสี
- สำรวจส่วนประกอบแต่ละส่วนของภาพ RGB
- การแปลงภาพเป็นส่วนประกอบ RGB แต่ละส่วน
- การแสดงฮิสโตแกรมของรูปภาพ
- การวาดภาพและรูปร่างโดยใช้ OpenCV
ศิลปะเป็นวิธีการมองเห็นและพวกเขาบอกว่าการมองเห็นคือการเชื่อ แต่สิ่งที่ตรงกันข้ามก็เป็นความจริงเช่นกันการเชื่อคือการมองเห็นและมันยากมากที่จะจินตนาการว่ามีชีวิตอยู่ในโลกนี้โดยปราศจากพรสวรรค์ในการมองเห็น - ดวงตาของเราการเป็นเด็กทารกนั้นวิเศษเพียงใด เมื่อเราลืมตาเราก็จะเห็นโลกและเริ่มรับรู้และมองเห็นโลกรอบตัวเรา แต่เมื่อเวลาผ่านไปประสบการณ์ที่ยอดเยี่ยมแบบเดียวกันก็กลายเป็นเรื่องธรรมดา แต่ในขณะที่เรากำลังก้าวหน้าด้วยเทคโนโลยีเราก็ใกล้จะถึงจุดที่เครื่องจักรสามารถมองเห็นและเข้าใจมันได้เช่นกัน ปัจจุบันดูเหมือนว่าจะไม่ใช่เรื่องไซไฟหากคุณเพียงแค่ปลดล็อกโทรศัพท์ด้วยใบหน้าของคุณ แต่เรื่องราวของการพัฒนาวิสัยทัศน์ของเครื่องนั้นย้อนหลังไปนานกว่า 20 ปี
ขั้นตอนแรกอย่างเป็นทางการในสาขานี้ถูกนำย้อนกลับไปในปี 2542 ในการริเริ่มของ Intel เมื่องานวิจัยทั้งหมดที่เกิดขึ้นได้รับความร่วมมือภายใต้OPEN CV (วิสัยทัศน์คอมพิวเตอร์โอเพ่นซอร์ส) ซึ่งเดิมเขียนด้วย C ++ โดยมีการเปิดตัวครั้งแรก 1.0 ในปี 2549 วินาที ในปี 2009 ที่สามในปี 2015 และที่สี่ในปี 2018 ตอนนี้ OpenCV มีอินเตอร์เฟส C ++, Python และ Java และรองรับ Windows, Linux, Mac OS, iOS และ Android ดังนั้นจึงสามารถติดตั้งได้อย่างง่ายดายใน Raspberry Pi ด้วยสภาพแวดล้อม Python และ Linux และ Raspberry Pi พร้อม OpenCV และกล้องที่ติดมาสามารถใช้เพื่อสร้างแอปพลิเคชันการประมวลผลภาพแบบเรียลไทม์มากมายเช่นการตรวจจับใบหน้าการล็อกใบหน้าการติดตามวัตถุการตรวจจับป้ายทะเบียนรถยนต์ระบบรักษาความปลอดภัยภายในบ้านเป็นต้น
ก่อนที่จะไปเรียนรู้การประมวลผลภาพโดยใช้ openCVสิ่งสำคัญคือต้องรู้ว่าภาพคืออะไรและมนุษย์และเครื่องจักรรับรู้ภาพเหล่านั้นอย่างไร
รูปภาพคืออะไร?
รูปภาพคือการแสดงสเปกตรัมแสงที่มองเห็นได้สองมิติ และสเปกตรัมแสงที่มองเห็นได้เป็นเพียงส่วนหนึ่งของสเปกตรัมแม่เหล็กไฟฟ้าที่อยู่ระหว่างสเปกตรัมอินฟราเรดและอัลตราไวโอเลต
ภาพเกิดขึ้นได้อย่างไร: - เมื่อแสงสะท้อนออกจากวัตถุไปยังฟิล์มเซ็นเซอร์หรือบนเรตินา
นี่คือวิธีการทำงานของดวงตาของเราโดยใช้ที่กั้นเพื่อปิดกั้นจุดไฟส่วนใหญ่โดยปล่อยให้ช่องเปิดเล็ก ๆ ซึ่งแสงสามารถผ่านได้เรียกว่ารูรับแสงและจะสร้างภาพที่โฟกัสได้มากและเป็นรูปแบบที่ใช้งานได้สำหรับกล้องรูเข็ม แต่มีปัญหาในกล้องรูเข็มปริมาณแสงเท่ากันจะเข้าสู่รูรับแสงซึ่งอาจไม่เหมาะกับฟิล์มหรือภาพที่เกิดขึ้นเราไม่สามารถรับภาพที่โฟกัสได้เพื่อที่จะโฟกัสภาพที่เรา จำเป็นต้องเลื่อนฟิล์มไปมา แต่เป็นปัญหาในหลาย ๆ สถานการณ์
หรือเราสามารถแก้ไขปัญหานี้ได้โดยใช้เลนส์มันช่วยให้เราควบคุมขนาดรูรับแสงและในการถ่ายภาพที่เรียกว่า f Stopโดยทั่วไปค่า f Stop ที่ต่ำกว่าจะดีกว่าในการถ่ายภาพ
ขนาดรูรับแสงยังช่วยให้เราได้ระยะชัดลึกที่ดีเรียกว่าโบเก้ในการถ่ายภาพทำให้เรามีฉากหลังเบลอในขณะที่เราโฟกัสที่ภาพ
คอมพิวเตอร์เก็บภาพอย่างไร
คุณอาจเคยได้ยินรูปแบบภาพต่างๆเช่น. PNG,.jpgG และอื่น ๆ ทั้งหมดนี้คือการแสดงภาพดิจิทัลของโลกแอนะล็อกของเราคอมพิวเตอร์ทำได้โดยการแปลภาพเป็นรหัสดิจิทัลเพื่อจัดเก็บแล้วตีความไฟล์กลับเป็นภาพ แสดง. แต่โดยพื้นฐานแล้วพวกเขาใช้แพลตฟอร์มทั่วไปในการจัดเก็บภาพและเช่นเดียวกันกับ openCV
OpenCVใช้พื้นที่สี RGB (แดงเขียวและน้ำเงิน) เป็นค่าเริ่มต้นสำหรับรูปภาพโดยที่พิกัดพิกเซล (x, y) มี 3 ค่าสำหรับความเข้มในรูปแบบ 8 บิตเช่น (0-255, 2 8)
การผสมความเข้มที่แตกต่างกันของแต่ละสีทำให้เราได้สเปกตรัมเต็มรูปแบบนั่นเป็นเหตุผลว่าทำไมในการวาดภาพหรืองานศิลปะสีทั้งสามนี้จึงถูกมองว่าเป็นสีหลักและสีอื่น ๆ ทั้งหมดเป็นสีรองเนื่องจากสีรองส่วนใหญ่สามารถเกิดจากสีหลักได้ เช่นเดียวกับสีเหลืองเรามีค่าต่อไปนี้: สีแดง - 255; เขียว - 255; สีน้ำเงิน - 0
ตอนนี้ภาพจะถูกเก็บไว้ในอาร์เรย์หลายมิติในการเขียนโปรแกรมอาร์เรย์คือชุดของชุดของวัตถุ และที่นี่เราจัดการกับอาร์เรย์สามประเภท 1D, 2D และ 3D โดยที่ 'D' หมายถึงมิติ
ภาพสีจะถูกจัดเก็บในอาร์เรย์สามมิติโดยที่มิติที่สามแสดงถึงสี RGB (ซึ่งเราจะเห็นในภายหลัง) และเมื่อรวมกันแล้วจะสร้างความเข้มของพิกเซลที่แตกต่างกันสำหรับภาพในขณะที่ภาพขาวดำจะถูกเก็บไว้ในอาร์เรย์สองมิติและยังมีภาพขาวดำ 2 ประเภทคือภาพสีเทาและภาพไบนารี
ภาพสีเทาเป็นรูปแบบจากเฉดสีเทาของอาร์เรย์สองมิติในขณะที่ภาพไบนารีมีพิกเซลเป็นสีดำหรือสีขาว
เหตุใดเครื่องจึงระบุภาพได้ยาก
การมองเห็นด้วยคอมพิวเตอร์เป็นงานที่ท้าทายในตัวเองคุณสามารถจินตนาการได้ว่าการทำให้เครื่องมีความรู้สึกการมองเห็นการจดจำและการระบุตัวตนนั้นยากเพียงใด มีปัจจัยต่อไปนี้ที่ทำให้การมองเห็นของคอมพิวเตอร์เป็นเรื่องยาก
- ข้อ จำกัด ของเซ็นเซอร์กล้องและเลนส์
- ดูรูปแบบต่างๆ
- การเปลี่ยนแสง
- การปรับขนาด
- การบดเคี้ยว
- รูปแบบคลาสออบเจ็กต์
- ภาพคลุมเครือ / ภาพลวงตา
การใช้งานและการใช้ OpenCV
แม้จะมีความยากลำบาก Computer Vision ก็มีเรื่องราวความสำเร็จมากมาย
- การนำทางหุ่นยนต์ - รถยนต์ขับเอง
- การตรวจจับและจดจำใบหน้า
- Search Engine ค้นหารูปภาพ
- การอ่านป้ายทะเบียน
- การจดจำลายมือ
- ตัวกรอง Snapchat และใบหน้า
- การรับรู้วัตถุ
- การติดตามบอลและผู้เล่นในกีฬา
- และอื่น ๆ อีกมากมาย!
การติดตั้ง OpenCV ด้วย Python และ Anaconda
OpenCV เขียนด้วยภาษา C ++ แต่มันยากมากที่จะใช้กับ C ++ ดังนั้นเราจึงเลือกที่จะใช้งานด้วยภาษาระดับสูงเช่น python และยังมีประโยชน์เพิ่มเติมในการนำ OpenCV ไปใช้กับ pythonเนื่องจาก Python เป็นหนึ่งในภาษาที่ง่ายที่สุด สำหรับผู้เริ่มต้นนอกจากนี้ยังมีประสิทธิภาพอย่างมากสำหรับวิทยาศาสตร์ข้อมูลและแอปพลิเคชันการเรียนรู้ของเครื่องและยังเก็บภาพในอาร์เรย์จำนวนมากซึ่งช่วยให้เราสามารถดำเนินการที่มีประสิทธิภาพได้อย่างง่ายดาย
การเขียนโปรแกรมขั้นพื้นฐานมีประโยชน์เมื่อใช้ Exposure to High School Level Math เว็บแคม Python 2.7 หรือ 3.6 (แนะนำให้ใช้ Anaconda Package)
ขั้นตอนที่ 1. ดาวน์โหลดและติดตั้งแพ็คเกจ Anaconda Python
ไปที่: https://www.anaconda.com/download และเลือกตามสภาพอากาศของเครื่องของคุณ windows, Linux หรือ mac และคุณสามารถเลือกสำหรับ python 2.7 หรือ python 3.7 เวอร์ชันสำหรับระบบ 64 Bit หรือระบบ 32 Bit ก็ได้ แต่ตอนนี้ วันส่วนใหญ่ของระบบเป็น 64 บิต
การกระจายงูหลามของอนาคอนดามาพร้อมกับสตูดิโอ Spyder สมุดบันทึก jupyter และพรอมต์อนาคอนดาซึ่งทำให้งูหลามเป็นมิตรกับการใช้งาน เราจะใช้สตูดิโอ spyder ในการทำตัวอย่าง
ตัวเลือกระหว่าง python 2.7 หรือ 3.7 นั้นเป็นกลางอย่างสมบูรณ์ แต่อย่างไรก็ตามสำหรับตัวอย่างเราจะใช้ python 3.7เนื่องจากเป็นอนาคตของ python และจะเข้าครอบครอง python 2.7 ในรูปแบบ 2020 นอกจากนี้ไลบรารีส่วนใหญ่กำลังได้รับการพัฒนาใน python 3.7 แง่มุมในอนาคตของหลามอยู่ในใจ นอกจากนี้ยังให้ผลลัพธ์ที่คาดหวังในการดำเนินการทางคณิตศาสตร์พื้นฐานเช่น (2/5 = 2.5) ในขณะที่ python 2.7 จะประเมินเป็น 2 นอกจากนี้การพิมพ์จะถือว่าเป็นฟังก์ชันใน python 3.7 (พิมพ์ ("สวัสดี")) ดังนั้นจึงให้ความสำคัญกับโปรแกรมเมอร์
ขั้นตอนที่ 2. การสร้างแพลตฟอร์มเสมือนจริงด้วย OpenCV
เรากำลังจะติดตั้ง OpenCV โดยสร้างแพลตฟอร์มเสมือนสำหรับสปายเดอร์โดยใช้ Anaconda promptและไฟล์ YML ที่อัปโหลดที่นี่
ด้วยไฟล์ YML เราจะติดตั้งแพ็คเกจและไลบรารีทั้งหมดที่จำเป็น แต่อย่างไรก็ตามหากคุณต้องการติดตั้งแพ็คเกจเพิ่มเติมใด ๆ คุณสามารถติดตั้งได้อย่างง่ายดายผ่านพรอมต์อนาคอนดาโดยเรียกใช้คำสั่งของแพ็คเกจนั้น
ไปที่ไอคอนค้นหา windows ของคุณและค้นหา anaconda prompt terminal คุณสามารถพบได้ในโฟลเดอร์ anaconda ที่คุณเพิ่งติดตั้ง
จากนั้นคุณจะต้องค้นหาไฟล์ YML ที่ดาวน์โหลดมาและจากที่นี่คุณมีสองทางเลือกไม่ว่าจะเป็นการเปลี่ยนไดเร็กทอรีของเทอร์มินัลไปยังตำแหน่งที่ดาวน์โหลดไฟล์ YML ของคุณหรือคัดลอกไฟล์ YML ของคุณไปยังไดเร็กทอรีที่ติดตั้งอนาคอนดาของคุณ กรณีจะอยู่ใน C: \ drive หลังจากคัดลอกไฟล์ YML ของคุณไปยังตำแหน่งที่ระบุให้เรียกใช้คำสั่งต่อไปนี้ในพรอมต์ของคุณ
conda env สร้าง –f virtual_platform_windows.yml
เนื่องจากระบบของฉันทำงานบน windowsไฟล์ YML และคำสั่งสอดคล้องกับ windows อย่างไรก็ตามคุณสามารถแก้ไขตามระบบของคุณได้โดยการแทนที่ windows ด้วย linux หรือ mac ตามลำดับ
หมายเหตุ: -หากการแตกแพ็กเกจมีข้อผิดพลาดให้ติดตั้ง pytorch และ numpy ก่อนแล้วจึงรันคำสั่งด้านบน
ขณะนี้พบนำทางงูใหญ่และจะมีเมนูแบบเลื่อนลงของ“การประยุกต์ใช้งานบน ___” และจากนั้นเลือกสภาพแวดล้อมเสมือนจริงแล้วจากนั้นคุณต้องเปิดสตูดิโอ Spyder
เพียงเท่านี้คุณก็พร้อมที่จะเริ่มแล้ว!
การเปิดและบันทึกภาพใน OpenCV
ที่นี่เรากำลังอธิบายคำสั่งพื้นฐานและคำศัพท์ในการใช้ Python ใน OpenCV เราจะเรียนรู้เกี่ยวกับฟังก์ชันพื้นฐานสามอย่างในโปรแกรม OpenCV imread, imshow และ imwrite
#comments ใน python ได้รับจาก # symbol
นำเข้า opencv ใน python โดยคำสั่ง
นำเข้า cv2
โหลดรูปภาพโดยใช้"imread"ระบุเส้นทางไปยังรูปภาพ
รูปภาพ = cv2.imread ('input.jpg')
ตอนนี้รูปภาพนั้นถูกโหลดและเก็บไว้ใน python เป็นตัวแปรที่เราตั้งชื่อเป็นรูปภาพ
ตอนนี้เพื่อแสดงตัวแปรรูปภาพของเราเราใช้'imshow'และพารามิเตอร์แรกสำหรับฟังก์ชัน imshow คือชื่อที่แสดงบนหน้าต่างรูปภาพและจะต้องป้อนใน ('') เพื่อแสดงชื่อเป็นสตริง
cv2.imshow ('สวัสดีชาวโลก', รูปภาพ)
Waitkeyช่วยให้เราป้อนข้อมูลเมื่อเปิดหน้าต่างภาพโดยเว้นว่างไว้รอให้กดปุ่มใดก็ได้ก่อนดำเนินการต่อโดยการวางตัวเลข (ยกเว้น 0) เราสามารถระบุการหน่วงเวลาสำหรับระยะเวลาที่คุณเปิดหน้าต่างไว้ (เวลา ในมิลลิวินาทีที่นี่)
cv2.waitKey ()
'destroyAllWindows'จะปิดหน้าต่างที่เปิดอยู่ทั้งหมดการไม่วางสิ่งนี้จะทำให้โปรแกรมของคุณค้าง
cv2.destroyAllWindows ()
สำหรับสิ่งนี้เราจะใช้ numpy ซึ่ง numpy เป็นไลบรารีสำหรับการเขียนโปรแกรม python สำหรับการเพิ่มการสนับสนุนอาร์เรย์และเมทริกซ์หลายมิติขนาดใหญ่
import cv2 #importing numpy import numpy เป็น np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) ฟังก์ชัน#shape มีประโยชน์มากเมื่อเราดูขนาดของอาร์เรย์ ส่งคืนทูเพิลซึ่งให้ขนาดของการ พิมพ์ รูปภาพ(image.shape) cv2.waitKey () cv2.destroyAllWindows ()
เอาท์พุทคอนโซล - (183, 275, 3), สองขนาดของภาพมีความสูง 183 พิกเซลและกว้าง 275 พิกเซลและ 3 หมายความว่ามีส่วนประกอบอื่น ๆ อีกสามส่วน (R, G, B) ที่ทำให้ภาพนี้ (แสดง ภาพสีจะถูกเก็บไว้ในอาร์เรย์สามมิติ)
พิมพ์ ('ความสูงของภาพ:', (image.shape, 'พิกเซล')) พิมพ์ ('ความกว้างของภาพ:', (image.shape, 'พิกเซล'))
เอาต์พุตคอนโซล -ความสูงของภาพ: (183, 'พิกเซล')
ความกว้างของภาพ: (275, 'พิกเซล')
บันทึกภาพที่แก้ไขใน OpenCV
เราใช้'imwrite'สำหรับระบุชื่อไฟล์และรูปภาพที่จะบันทึก
cv2.imwrite ('output.jpg', รูปภาพ) cv2.imwrite ('output.png', รูปภาพ)
อาร์กิวเมนต์แรกคือชื่อไฟล์ที่เราต้องการบันทึก {เพื่ออ่านหรือบันทึกไฟล์ที่เราใช้ ('') เพื่อระบุว่าเป็นสตริง} และอาร์กิวเมนต์ที่สองคือชื่อไฟล์
OpenCV ช่วยให้คุณบันทึกภาพในรูปแบบต่างๆ
ภาพสเกลสีเทาใน OpenCV
Greyscalingคือกระบวนการที่ภาพถูกแปลงจากสีเต็มเป็นเฉดสีเทา (ขาวดำ)
ใน opencv ฟังก์ชั่นมากมายจะทำให้ภาพเป็นสีเทาก่อนการประมวลผล สิ่งนี้ทำได้เนื่องจากทำให้ภาพง่ายขึ้นโดยทำหน้าที่ลดจุดรบกวนและเพิ่มเวลาในการประมวลผลเนื่องจากมีข้อมูลในภาพน้อย (เนื่องจากภาพสีเทาจะถูกเก็บไว้ในอาร์เรย์สองมิติ)
นำเข้า cv2 # โหลดภาพอินพุตของเรา image = cv2.imread ('input.jpg') cv2.imshow ('original', image) cv2.waitKey () # เราใช้ cvtcolor เพื่อแปลงเป็น greyscale gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('grayscale', gray_image) cv2.waitKey () cv2.destroyALLWindows ()
วิธีที่ง่ายกว่าในการแปลงรูปภาพเป็นโทนสีเทาก็แค่เพิ่มอาร์กิวเมนต์ 0 ใน ฟังก์ชัน imread ข้างชื่อรูปภาพ
นำเข้า cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('grayscale', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy เป็น np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('grayscale', gray_image) พิมพ์ (gray_image.shape) cv2.waitKey () cv2.destroyALLWindows ()
เอาต์พุตคอนโซล: - (183, 275, 3) - สำหรับภาพสี
(183, 275) - สำหรับภาพระดับสีเทา
ดังนั้นจึงแสดงให้เห็นอย่างชัดเจนว่าภาพสีจะแสดงด้วยอาร์เรย์สามมิติในขณะที่ภาพสเกลสีเทาโดยอาร์เรย์สองมิติ
ช่องว่างสี
ช่องว่างสีเป็นวิธีจัดเก็บภาพ RGB, HSV, CMYK คือช่องว่างสีต่างๆซึ่งเป็นเพียงวิธีง่ายๆในการแสดงสี
RGB -แดงเขียวและน้ำเงิน
HSV -สีความอิ่มตัวและค่า
และCMYKมักใช้ในเครื่องพิมพ์อิงค์เจ็ท
พื้นที่สี RGB หรือ BGR
พื้นที่สีเริ่มต้นของ OpenCV คือ RGB RGB เป็นแบบจำลองสีเสริมที่สร้างสีโดยการรวมสีฟ้าเขียวและแดงที่มีความเข้ม / ความสว่างต่างกัน ใน OpenCV เราใช้ความลึกของสี 8 บิต
- แดง (0-255)
- สีน้ำเงิน (0-255)
- สีเขียว (0-255)
อย่างไรก็ตามOpenCV จริงเก็บสีในรูปแบบ
ความสนุก: - เราใช้คำสั่ง BGR ในคอมพิวเตอร์เนื่องจากจำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อถูกเก็บไว้ในหน่วยความจำอย่างไรจึงยังคงถูกจัดเก็บเป็น RGB จำนวนเต็มแทนสีเช่น - 0X00BBGGRR จะถูกจัดเก็บเป็น 0XRRGGBB
พื้นที่สี HSVHSV (Hue, Saturation & value / Brightness) เป็นพื้นที่สีที่พยายามแสดงสีที่มนุษย์รับรู้ เก็บข้อมูลสีในรูปทรงกระบอกแทนจุดสี RGB
สี - ค่าสี (0-179)
ความอิ่มตัว - ความสั่นสะเทือนของสี (0-255)
ค่า - ความสว่างหรือความเข้ม (0-255)
รูปแบบพื้นที่สี HSV มีประโยชน์ในการแบ่งส่วนสี ใน RGB การกรองสีที่เฉพาะเจาะจงไม่ใช่เรื่องง่าย แต่ HSV ทำให้ง่ายขึ้นมากในการกำหนดช่วงสีเพื่อกรองสีเฉพาะตามที่เรารับรู้
Hue แสดงถึงสีใน HSV ค่าสีอยู่ในช่วง 0 - 180 ไม่ใช่ 360 ดังนั้นจึงไม่ทำให้วงกลมเต็มสมบูรณ์ดังนั้นจึงมีการแมปที่แตกต่างจากมาตรฐาน
ฟิลเตอร์ช่วงสี
- แดง - (165-15)
- สีเขียว - (45-75)
- สีน้ำเงิน - (90-120)
ดังที่เราทราบว่าภาพที่จัดเก็บในพื้นที่สี RGB (แดงเขียวและน้ำเงิน) ดังนั้น OpenCV ก็แสดงให้เราเห็นเหมือนกัน แต่สิ่งแรกที่ต้องจำเกี่ยวกับรูปแบบ RGB ของ opencv คือมันเป็น BGR จริง ๆ และเราสามารถรู้ได้โดยดูที่ รูปร่างของภาพ
import cv2 import numpy เป็น np image = cv2.imread ('input.jpg') # B, G, R ค่าสำหรับ 0,0 พิกเซลแรก B, G, R = พิมพ์ ภาพ(B, G, R) พิมพ์ (image.shape) # ตอนนี้ถ้าเราใช้สิ่งนี้กับภาพสีเทา gray_img = cv2.cvtColor (ภาพ, cv2.COLOR_BGR2GRAY) พิมพ์ (gray_img.shape) #gray_image ค่าพิกเซลสำหรับการ พิมพ์10,50 พิกเซล(gray_img)
เอาต์พุตคอนโซล: พิมพ์ (B, G, R) - 6 11 10
พิมพ์ (image.shape) - (183, 275, 3)
พิมพ์ (gray_img.shape) - (183, 275)
พิมพ์ (gray_img) - 69
ขณะนี้มีเพียงสองมิติในภาพสเกลสีเทาเนื่องจากเราจำได้ว่าภาพสีถูกจัดเก็บเป็นสามมิติมิติที่สามคือ (R, G, B)ในขณะที่ในโทนสีเทาจะมีเพียงสองมิติเท่านั้นเนื่องจาก (R, G, B) ขาดไปและสำหรับตำแหน่งพิกเซลเฉพาะเราได้รับเพียงค่าเดียวในขณะที่อยู่ในภาพสีเรามีค่าสามค่า
พื้นที่สีที่มีประโยชน์อีกอย่างคือ HSV
นำเข้า ภาพ cv2 = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (รูปภาพ, cv2.COLOR_BGR2HSV) cv2.imshow ('ภาพ HSV', hsv_image) cv2 Hue.imshow ('channel', hsv_image) cv2 imshow ('ช่องอิ่มตัว', hsv_image) cv2.imshow ('ช่องค่า', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
หลังจากเรียกใช้โค้ดแล้วคุณจะเห็นภาพสี่ภาพซึ่งสามภาพเป็นของแต่ละช่องและอีกภาพเป็นภาพ HSV รวมกัน
ภาพช่องเว้ค่อนข้างมืดเนื่องจากค่าของมันแตกต่างกันไปตั้งแต่ 0 ถึง 180 เท่านั้น
นอกจากนี้โปรดทราบว่าฟังก์ชัน imshow พยายามแสดงภาพ RGB หรือ BGR ให้คุณเห็น แต่การแปลง HSV จะซ้อนทับกัน
นอกจากนี้ช่องค่าจะคล้ายกับระดับสีเทาของภาพเนื่องจากความสว่าง
สำรวจส่วนประกอบแต่ละส่วนของภาพ RGB
นำเข้า ภาพ cv2 = cv2.imread ('input.jpg') # ฟังก์ชันการแยกของ opencv จะแยก imageinti แต่ละดัชนีสี B, G, R = cv2.split (ภาพ) cv2.imshow ("Red", R) cv2.imshow ("สีเขียว", G) cv2.imshow ("สีน้ำเงิน", B) # สร้างภาพต้นฉบับโดยการรวมส่วนประกอบสีแต่ละสีที่ ผสาน = cv2.merge () cv2.imshow ("ผสาน", ผสาน) #amplifying สีฟ้าที่ ผสาน = cv2.merge () cv2.imshow ("ผสานกับการขยายสีน้ำเงิน" ผสาน) # แสดงรูปร่างของส่วนประกอบสีแต่ละสี # เอาต์พุตจะมีเพียงสองมิติในขณะที่ความสูงและความกว้างจะมีความสูงและความกว้างเนื่องจากองค์ประกอบที่สามของส่วนประกอบ RGB เป็นตัวแทนการ พิมพ์ (B.shape) แบบแยกส่วน (R.รูปร่าง) พิมพ์ (G.shape) cv2.waitKey (0) cv2.destroyAllWindows ()
เอาต์พุตคอนโซล: # ขนาดของรูปภาพจากฟังก์ชันรูปร่าง
(183, 275)
(183, 275)
(183, 275)
การแปลงภาพเป็นส่วนประกอบ RGB แต่ละส่วน
ในโค้ดด้านล่างนี้เราได้สร้างเมทริกซ์ของศูนย์ที่มีขนาดของรูปภาพ HxW ศูนย์จะส่งคืนอาร์เรย์ที่เต็มไปด้วยศูนย์ แต่มีขนาดเท่ากัน
ฟังก์ชัน Shape มีประโยชน์มากเมื่อเราดูมิติของรูปภาพและที่นี่เราได้ทำการแบ่งส่วนของฟังก์ชันรูปร่างนั้น ดังนั้น รูปร่าง จะจับทุกอย่างจนถึงจุดที่กำหนดเช่นไม่เกินจุดที่กำหนดที่สองซึ่งจะเป็นความสูงและความกว้างของภาพส่วนที่สามแสดงถึงองค์ประกอบ RGB ของภาพและเราไม่ต้องการที่นี่
import cv2 import numpy เป็น np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) zeros = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("สีแดง", cv2.merge ()) cv2.imshow ("สีเขียว", cv2.merge ()) cv2.imshow ("สีน้ำเงิน", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
การแสดงฮิสโตแกรมของรูปภาพ
ตัวแทน Histogram ของภาพเป็นวิธีการแสดงส่วนประกอบของภาพ
รหัสต่อไปนี้ช่วยให้คุณวิเคราะห์ภาพผ่านฮิสโตแกรมสีของส่วนประกอบสีที่รวมกันและแต่ละสี
import cv2 import numpy เป็น np # เราต้องอิมพอร์ต matplotlib เพื่อสร้างฮิสโตแกรมพล็อต นำเข้า matplotlib.pyplot เป็น plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (`` ไม่มี,,) # เราพล็อต a ฮิสโตแกรม ravel () ทำให้อาร์เรย์ภาพของเรา แบน plt.hist (image.ravel (), 256,) plt.show () # การดูช่องสีแยก สี = ('b', 'g', 'r') # เรารู้ แยกสีและพล็อตแต่ละสีในฮิสโตแกรม สำหรับ i, col ในการแจงนับ (สี): histogram2 = cv2.calcHist (, ไม่มี,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
มาทำความเข้าใจกับฟังก์ชัน calcHist กับพารามิเตอร์แต่ละตัวกัน
cv2.calcHist (รูปภาพช่องมาสก์histsize ช่วง)
รูปภาพ: เป็นอิมเมจต้นทางของประเภท uint 8 หรือ float 32 โดยควรกำหนดไว้ในวงเล็บเหลี่ยมเช่น“” ซึ่งระบุอาร์เรย์ระดับที่สองด้วยเนื่องจากรูปภาพสำหรับ opencv เป็นข้อมูลในรูปแบบอาร์เรย์
ช่อง:มีให้ในวงเล็บเหลี่ยม เป็นดัชนีของช่องที่เราคำนวณฮิสโตแกรมตัวอย่างเช่นหากอินพุตเป็นภาพระดับสีเทาค่าของมันคือสำหรับภาพสีที่คุณสามารถส่งผ่านหรือคำนวณฮิสโตแกรมของช่องสีน้ำเงินสีเขียวและสีแดงตามลำดับ
หน้ากาก:ภาพหน้ากาก หากต้องการค้นหาฮิสโตแกรมของภาพเต็มจะได้รับเป็น "ไม่มี" แต่ถ้าคุณต้องการค้นหาฮิสโตแกรมของพื้นที่ใดส่วนหนึ่งของภาพคุณต้องสร้างภาพมาสก์สำหรับสิ่งนั้นและให้เป็นมาสก์
Histsize:นี่แสดงถึงจำนวน BIN ของเรา จำเป็นต้องกำหนดให้อยู่ในวงเล็บเหลี่ยมสำหรับขนาดเต็มที่เราผ่าน
ช่วง:นี่คือช่วงของเราโดยปกติคือ
การวาดภาพและรูปร่างโดยใช้ OpenCV
ด้านล่างนี้เป็นตัวอย่างบางส่วนสำหรับการวาดเส้นสี่เหลี่ยมผืนผ้ารูปหลายเหลี่ยมวงกลม ฯลฯ ใน OpenCV
import cv2 import numpy เป็น np # การสร้าง ภาพ สี่เหลี่ยมสีดำ= np.zeros ((512,512,3), np.uint8) # เรายังสามารถสร้างสิ่งนี้เป็นขาวดำได้ แต่จะไม่มีการเปลี่ยนแปลงใด ๆ image_bw = np.zeros ((512,512), np.uint8) cv2.imshow ("สี่เหลี่ยมผืนผ้าสีดำ (สี)", รูปภาพ) cv2.imshow ("สี่เหลี่ยมผืนผ้าสีดำ (B&W)", image_bw)
ไลน์
# สร้างเส้นบนสี่เหลี่ยมสีดำ # cv2.line (รูปภาพ, พิกัดเริ่มต้น, พิกัดสิ้นสุด, สี, ความหนา) # วาดเส้นทแยงมุมความหนา 5 พิกเซล รูปภาพ = np.zeros ((512,512,3), np.uint8) cv2.line (รูปภาพ, (0,0), (511,511), (255,127,0), 5) cv2.imshow ("เส้นสีน้ำเงิน", รูปภาพ)
สี่เหลี่ยมผืนผ้า
# สร้างสี่เหลี่ยมผืนผ้าบนสี่เหลี่ยมสีดำ # cv2.rectangle (รูปภาพ, พิกัดเริ่มต้น, พิกัดสิ้นสุด, สี, ความหนา) # การวาดรูปสี่เหลี่ยมผืนผ้าที่มีความหนา 5 พิกเซล image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (รูปภาพ, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("สี่เหลี่ยมผืนผ้า", รูปภาพ)
วงกลม# สร้างวงกลมบนสี่เหลี่ยมสีดำ # cv2.circle (รูปภาพ, ศูนย์กลาง, รัศมี, สี, เติม) image = np.zeros ((512,512,3), np.uint8) cv2.circle (รูปภาพ, (100,100), (50), (255,127,0), - 1) cv2.imshow ("วงกลม", รูปภาพ)
รูปหลายเหลี่ยม# การสร้าง ภาพ รูปหลายเหลี่ยม= np.zeros ((512,512,3), np.uint8) #lets กำหนดสี่จุด pts = np.array (,,,], np.int32) # ตอนนี้สร้างจุดของเราใหม่ในรูปแบบที่ polylines pts = pts.reshape ((- 1,1,2)) cv2.polylines (รูปภาพ, จริง, (0,255,255), 3) cv2.imshow ("รูปหลายเหลี่ยม", รูปภาพ)
ข้อความ#putting ข้อความโดยใช้ opencv # cv2.putText (รูปภาพ, 'ข้อความที่จะแสดง', จุดเริ่มต้นด้านซ้ายของ bootom, แบบอักษร, ขนาดตัวอักษร, สี, ความหนา) image = np.zeros ((512,512,3), np.uint8) cv2 putText (รูปภาพ, "สวัสดีชาวโลก", (75,290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("สวัสดีชาวโลก", รูปภาพ) cv2.waitKey (0) cv2.destroyAllWindows ()
Computer Vision และ OpenCV เป็นหัวข้อที่ครอบคลุมมากมาย แต่คู่มือนี้จะเป็นจุดเริ่มต้นที่ดีในการเรียนรู้ OpenCV และการประมวลผลภาพ