Histograms - 1 : Find, Plot, Analyze !!!

จาก Morange Wiki

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

  • ค้นหา histograms โดยใช้ทั้งการ OpenCV และฟังก์ชั่ Numpy
  • histograms พล็อตโดยใช้ OpenCV และฟังก์ชั่ Matplotlib
  • คุณจะเห็นฟังก์ชั่นเหล่านี้ cv2.calcHist (), np.histogram ()


ทฤษฎี
คุณสามารถพิจารณา histogram เป็นกราฟหรือพล็อตที่ช่วยเกี่ยวกับการกระจายความเข้มของภาพ มันเป็นพล็อตที่มีค่าพิกเซล (ตั้งแต่ 0 ถึง 255 ไม่เสมอไป) ในแกน X และจำนวนพิกเซลที่สอดคล้องกันในภาพบน Y-แกน
การทำความเข้าใจภาพอื่น histogram ของภาพที่คุณได้รับเกี่ยวกับค่าของ ความสว่าง คมชัด ฯลฯ กระจายความเข้มของภาพ เกือบทุกเครื่องมือประมวลผลภาพใจะมีกราฟแสดงความถี่ ด้านล่างนี้เป็นภาพจากเคมบริดจ์

Selection 030.jpg

คุณสามารถดูภาพและ histogram ของมัน (อย่าลืมว่า histogram นี้ถูกวาดภาพสีเทาไม่ได้ภาพสี) มุมด้านซ้ายของ histogram แสดงจำนวนของพิกเซลในภาพสีเข้มและมุมขวาแสดงจำนวนของพิกเซลที่สว่าง จากกราฟคุณจะเห็นมุมมืดเป็นมากกว่ามุมที่สดใสและปริมาณของระดับกลาง (ค่าพิกเซลในช่วงกลางกล่าวว่ารอบ 127) เป็นอย่างน้อย

Find Histogram เราสามารถมองเข้าไปในวิธีการค้นหา OpenCV และ Numpy มาพร้อมกับฟังก์ชั่นในการสร้างขึ้นสำหรับการนี้ ก่อนที่จะใช้ฟังก์ชั่นที่เราต้องเข้าใจคำศัพท์บางอย่างที่เกี่ยวข้องกับ histograms

BINS:จำนวนของพิกเซลสำหรับค่าพิกเซลทุกคนเช่นจาก 0 ถึง 255 เช่นคุณต้อง 256 ค่าเพื่อแสดง histogram ดังกล่าวข้างต้น แต่พิจารณาสิ่งที่ถ้าคุณไม่จำเป็นต้องพบจำนวนของพิกเซลสำหรับค่าพิกเซลทั้งหมดแยกกัน แต่จำนวนของพิกเซลในช่วงของค่าพิกเซลหรือไม่? กล่าวว่าสำหรับตัวอย่างเช่นคุณต้องการที่จะหาจำนวนของพิกเซลนอนอยู่ระหว่าง 0-15 แล้ว 16 ไปยัง 31, ... , 240 ถึง 255 คุณจะต้องเพียง 16 ค่าเพื่อเป็นตัวแทนของกราฟ และนั่นคือสิ่งที่จะปรากฏในตัวอย่างที่กำหนดใน DIMS:มันเป็นจำนวนพารามิเตอร์ที่เราเก็บรวบรวมข้อมูล ในกรณีนี้เราเก็บรวบรวมข้อมูลเกี่ยวกับการเพียงสิ่งเดียวที่ค่าความเข้ม ดังนั้นที่นี่มันเป็น 1 RANGE:มันเป็นช่วงของความเข้มค่าที่คุณต้องการวัด ปกติก็เป็น [0256] คือค่าความเข้มทั้งหมด

1.Histogram Calculation in OpenCV ดังนั้นตอนนี้เราใช้ cv2.calcHist () ฟังก์ชันเพื่อหาแท่ง ลองมาทำความรู้จักกับการทำงานและพารามิเตอร์

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
1.ภาพ มันเป็นภาพที่มาจากประเภท uint8 หรือ float32 มันควรจะได้รับในวงเล็บคือ "[IMG]"
2.ช่อง อยู่ในวงเล็บ เป็นดัชนีของช่องที่เราคำนวณ histogram ตัวอย่างเช่นถ้าใส่เป็นภาพสีเทาค่าที่เป็น [0] สำหรับภาพสีคุณสามารถส่ง [0], [1] หรือ [2] ในการคำนวณ histogram สีฟ้า, สีเขียวหรือสีแดงช่องตามลำดับ
3.mask: ภาพ mask เพื่อหา histogram ของภาพเต็มก็จะได้รับเป็น "None" แต่ถ้าคุณต้องการที่จะหาสโตแกรมโดยเฉพาะอย่างยิ่งภาพที่คุณต้องสร้างภาพ mask สำหรับให้มันเป็นหน้ากาก
3.HISTSIZE: นี้หมายถึงการนับ BIN ต้องการที่จะได้รับในวงเล็บ สำหรับขนาดเต็มเราผ่าน [256]
4.ช่วง:นี้เป็นช่วงของเรา ปกติก็เป็น [0256]
 img = cv2.imread('home.jpg',0)
 hist = cv2.calcHist([img],[0],None,[256],[0,256])

hist เป็นอาร์เรย์ 256x1 แต่ละคุ้มค่าสอดคล้องกับจำนวนของพิกเซลในภาพที่มีค่าพิกเซลที่สอดคล้องกัน

2. Histogram Calculation in Numpy
numpy ยังช่วยให้คุณฟังก์ชั่น np.histogram () ดังนั้นแทนที่จะ calcHist () ฟังก์ชั่นที่คุณสามารถลองด้านล่างบรรทัด

hist,bins = np.histogram(img.ravel(),256,[0,256])

hist เป็นเช่นเดียวกับที่เราคำนวณได้ก่อน 257 องค์ประกอบเพราะ Numpy คำนวณเป็น 0-0.99, 1-1.99, 2-2.99 ฯลฯ ดังนั้นช่วงสุดท้ายจะ 255-255.99 เพื่อแสดงว่าพวกเขายังเพิ่ม 256 ในตอนท้าย แต่เราไม่จำเป็นต้องที่ 256 ไม่เกิน 255 ก็เพียงพอแล้ว

พล็อต Histograms

1.วิธีที่สั้น: ใช้ฟังก์ชั่นการวางแผน Matplotlib
2.วิธียาว: ฟังก์ชั่นการวาดภาพการใช้ OpenCV

1. Using Matplotlib
Matplotlib มาพร้อมกับฟังก์ชั่นการวางแผน histogram: matplotlib.pyplot.hist ()

คุณไม่จำเป็นต้องใช้ calcHist () หรือ np.histogram () ฟังก์ชันเพื่อหาแท่ง ดูโค๊ดข้างล่างนี้

 import cv2
 import numpy as np
 from matplotlib import pyplot as plt
 
 img = cv2.imread('joy.jpg',0)
 plt.hist(img.ravel(),256,[0,256]); plt.show()
มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย
มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย

หรือคุณสามารถใช้พล็อตปกติของ matplotlib ซึ่งจะเป็นสิ่งที่ดีสำหรับ BGR พล็อต เพื่อที่คุณจะต้องไปหาข้อมูล histogram แรก ลองด้านล่างโค๊ด

 import cv2
 import numpy as np
 from matplotlib import pyplot as plt
 
 img = cv2.imread('home.jpg')
 color = ('b','g','r')
 for i,col in enumerate(color):
     histr = cv2.calcHist([img],[i],None,[256],[0,256])
     plt.plot(histr,color = col)
     plt.xlim([0,256])
 plt.show()

ผลลัพธ์

Histogram rgb plot.jpg

คุณลดค่าจากกราฟข้างต้นที่ว่าฟ้ามีพื้นที่ค่าบางอย่างสูงในภาพ (ชัดมันควรจะเป็นเนื่องจากภาพพื่นหลัง)

2. Using OpenCV
Application of Mask
เราใช้ cv2.calcHist () เพื่อหา histogram ของภาพที่เต็มรูปแบบ ถ้าคุณต้องการที่จะหา histograms ของพื้นที่บางส่วนของภาพอยู่แล้ว? เพียงแค่สร้างภาพหน้ากากสีขาวบนพื้นที่ที่คุณต้องการที่จะหา histogram และสีดำเป็นอย่างอื่น แล้วผ่านนี้เป็นหน้ากาก

 img = cv2.imread('joy.jpg',0)
 
 # สร้าง หน้ากาก
 mask = np.zeros(img.shape[:2], np.uint8)
 mask[100:300, 100:400] = 255
 masked_img = cv2.bitwise_and(img,img,mask = mask)
 
 # Calculate histogram with mask and without mask
 # Check third argument for mask
 hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
 hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])
 
 plt.subplot(221), plt.imshow(img, 'gray')
 plt.subplot(222), plt.imshow(mask,'gray')
 plt.subplot(223), plt.imshow(masked_img, 'gray')
 plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
 plt.xlim([0,256])
 
 plt.show()

เห็นผล ในพล็อตกราฟเส้นสีน้ำเงินแสดง histogram ของภาพเต็มรูปแบบในขณะที่สายสีเขียวแสดง histogram ของภูมิภาคสวมหน้ากาก

มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย