Basic Operations on Images

จาก Morange Wiki

วัตถุประสงค์

  • ค่าพิกเซลเข้าถึงและปรับเปลี่ยนได้
  • คุณสมบัติการเข้าถึงภาพ
  • การตั้งค่าพื้นที่ของภาพ (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
  • 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()
มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย