Basic Operations on Images
วัตถุประสงค์
- ค่าพิกเซลเข้าถึงและปรับเปลี่ยนได้
- คุณสมบัติการเข้าถึงภาพ
- การตั้งค่าพื้นที่ของภาพ (ROI)
- การแยกและภาพผสาน
เกือบทุกการดำเนินงานในส่วนนี้ ส่วนใหญ่จะเกี่ยวข้องกับ Numpy มากกว่า OpenCV ต้องมีความรู้ Numpy จึงจะเพิ่มประสิทธิภาพที่ดีขึ้นกับ OpenCV การเข้าถึงและการปรับเปลี่ยนค่าพิกเซล ลองโหลดภาพสี
>>> import cv2 >>> import numpy as np >>> img = cv2.imread('joy.jpg')
คุณสามารถเข้าถึงค่าพิกเซลโดย แถวและคอลัมน์พิกัด สำหรับภาพ BGR ก็จะส่งกลับอาร์เรย์ของสีฟ้า, สีเขียว, ค่าแดง สำหรับภาพสีเทาเข้มเพียงที่สอดคล้องกันจะถูกส่งกลับ
>>> px = img[100,100] >>> print px [157 166 200] # การเข้าถึงพิกเซลสีฟ้า >>> blue = img[100,100,0] >>> print blue 157
คุณสามารถปรับเปลี่ยนค่าพิกเซลได้
>>> img[100,100] = [255,255,255] >>> print img[100,100] [255 255 255]
การเข้าถึงพิกเซลและวิธีการแก้ไขที่ดีกว่า
# accessing RED value >>> img.item(10,10,2) 59 # การปรับเปลี่ยนค่าสีแดง >>> img.itemset((10,10,2),100) >>> img.item(10,10,2) 100
การเข้าถึงคุณสมบัติของภาพ
คุณสมบัติของภาพ จำนวนแถวคอลัมน์และช่อง ประเภทของข้อมูลภาพ จำนวนพิกเซล ฯลฯ
รูปร่างของภาพที่มีการเข้าถึงโดย img.shape tuple จำนวนแถวคอลัมน์และช่องทาง (ถ้าภาพเป็นสี)
>>> print img.shape (342, 548, 3)
จำนวนของพิกเซลที่มีการเข้าถึงโดย img.size
>>> print img.size 562248
ประเภทข้อมูลภาพจะได้รับโดย img.dtype
>>> print img.dtype uint8
Image ROI
สำหรับการตรวจสอบภาพในตา, เราเลือกบริเวณใบหน้าเพียงอย่างเดียวและค้นหาดวงตา จะช่วยเพิ่มความถูกต้อง (เพราะตาอยู่เสมอบนใบหน้า)
และประสิทธิภาพการทำงาน (เพราะเราค้นหาสำหรับพื้นที่ขนาดเล็ก)
>>> ball = img[280:340, 330:390] >>> img[273:333, 100:160] = ball
ผลการตรวจสอบ
การแยกและการผสานช่องภาพ บางครั้งคุณจะต้องแยก B, G, ช่อง R ของภาพ แล้วคุณจะต้องแยกภาพ BGR หรือเวลาอื่นคุณอาจจำเป็นต้องเข้าร่วมแต่ละช่องเหล่านี้ไปยังภาพ BGR คุณสามารถทำมันได้ง่ายๆโดย
>>> b,g,r = cv2.split(img) >>> img = cv2.merge((b,g,r))
หรือ
>>> b = img[:,:,0]
สมมติว่าคุณต้องการที่จะทำให้ทุกพิกเซลสีแดงให้เป็นศูนย์ คุณไม่จำเป็นต้องแยกเช่นนี้และวางไว้เท่ากับศูนย์ คุณก็สามารถใช้การจัดทำดัชนี Numpy และที่มีมากขึ้นเร็วขึ้น
>>> img[:,:,2] = 0
ทำให้ขอบเขตสำหรับภาพ (Padding)
- src - นำภาพเข้า
- ด้านบน ด้านล่างซ้าย-ขวา - ความกว้างขอบเขตจำนวนพิกเซลในทิศทางที่สอดคล้องกัน
- borderType - ธงการกำหนดสิ่งที่ชนิดของชายแดนที่จะเพิ่ม มันสามารถประเภทต่อไปนี้
- cv2.BORDER_CONSTANT - เพิ่มเส้นขอบสีคงค่าที่ควรจะได้รับเป็นอาร์กิวเมนต์ต่อไป
- cv2.BORDER_REFLECT - เส้นจะแสดงขอบเขต : fedcba | ABCDEFGH | hgfedcb
- cv2.BORDER_REFLECT_101 หรือ cv2.BORDER_DEFAULT - เหมือนข้างบน แต่มีการเปลี่ยนแปลงเล็กน้อยเช่นนี้ gfedcb | ABCDEFGH | gfedcba
- cv2.BORDER_REPLICATE - องค์ประกอบสุดท้ายคือการจำลองแบบทั่วไปเช่นนี้ aaaaaa | ABCDEFGH | hhhhhhh
- cv2.BORDER_WRAP - ลักษณะต่างๆ cdefgh | ABCDEFGH | abcdefg
- cv2.BORDER_CONSTANT - เพิ่มเส้นขอบสีคงค่าที่ควรจะได้รับเป็นอาร์กิวเมนต์ต่อไป
- value - สีของเส้นขอบถ้าชนิดชายแดน cv2.BORDER_CONSTANT
ด้านล่างนี้เป็นตัวอย่างรหัสแสดงให้เห็นถึงทุกประเภทเขอบเขตเหล่านี้เพื่อความเข้าใจที่ดีกว่า
import cv2 import numpy as np from matplotlib import pyplot as plt BLUE = [255,0,0] img1 = cv2.imread('joy.png') replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE) reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT) reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101) wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP) constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE) plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL') plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE') plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT') plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101') plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP') plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT') plt.show()