Histograms - 2: Histogram Equalization

จาก Morange Wiki

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

  • เราจะได้เรียนรู้แนวคิดของเท่าเทียมกัน Histogram และใช้ในการปรับปรุงความคมชัดของภาพของเรา


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

Selection 035.png


Histogram สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้ แต่ก็มีคำอธิบายที่ดีมากกับการทำงานออกตัวอย่างเพื่อที่คุณจะเข้าใจเกือบทุกอย่างหลังจากที่ได้อ่านว่า แต่ที่นี่เราจะเห็นการดำเนินงานของ Numpy หลังจากนั้นเราจะได้เห็นการทำงานของ OpenCV

 import cv2
 import numpy as np
 from matplotlib import pyplot as plt
 
 img = cv2.imread('joy.jpg',0)
 
 hist,bins = np.histogram(img.flatten(),256,[0,256])
 
 cdf = hist.cumsum()
 cdf_normalized = cdf * hist.max()/ cdf.max()
 
 plt.plot(cdf_normalized, color = 'b')
 plt.hist(img.flatten(),256,[0,256], color = 'r')
 plt.xlim([0,256])
 plt.legend(('cdf','histogram'), loc = 'upper left')
 plt.show()
มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย


สำหรับการที่เราต้องมีฟังก์ชั่นการเปลี่ยนแปลงซึ่งแผนที่พิกเซลป้อนข้อมูลในค่าความสว่างพิกเซลการส่งออกในกราฟอย่างเต็มรูปแบบ นั่นคือสิ่งที่ไม่เท่าเทียมกัน Histogram

ตอนนี้เราหาค่า histogram ขั้นต่ำ (ไม่รวม 0) และใช้สมการเท่าเทียมกัน Histogram แต่ฉันได้ใช้ที่นี่อาร์เรย์แนวคิดอาร์เรย์สวมหน้ากากจาก Numpy สำหรับอาร์เรย์สวมหน้ากากดำเนินการทั้งหมดจะดำเนินการในองค์ประกอบที่ไม่สวมหน้ากาก คุณสามารถอ่านเพิ่มเติมได้จากเอกสาร Numpy บนอาร์เรย์สวมหน้ากาก

 cdf_m = np.ma.masked_equal(cdf,0)
 cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
 cdf = np.ma.filled(cdf_m,0).astype('uint8')

Histograms Equalization in OpenCV
OpenCV มีฟังก์ชั่นการทำเช่นนี้ cv2.equalizeHist () การป้อนข้อมูลของมันคือภาพเพียงแค่สีเทาและการส่งออกของเราเป็น histogram

ด้านล่างเป็นโค้ดที่แสดงการใช้งานภาพเดียวกันกับที่เราใช้

 img = cv2.imread('joy.jpg',0)
 equ = cv2.equalizeHist(img)
 res = np.hstack((img,equ)) #stacking images side-by-side
 cv2.imwrite('res.png',res)
มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย


ดังนั้นตอนนี้คุณสามารถใช้ภาพที่แตกต่างกันกับสภาพแสงที่แตกต่างกันเท่ากันและผลการตรวจสอบ

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

CLAHE (Contrast Limited Adaptive Histogram Equalization)
histogram แรกที่เราเพิ่งเห็นพิจารณาความคมชัดของภาพ ในหลายกรณีก็ไม่ได้เป็นความคิดที่ดี ยกตัวอย่างเช่นภาพด้านล่างแสดงให้เห็นภาพที่นำเข้าและผลหลังจากที่เท่าเทียมกัน histogram ทั่วโลก

Clahe 1.jpg

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

 import numpy as np
 import cv2
 
 img = cv2.imread('tsukuba_l.png',0)
 
 # create a CLAHE object (Arguments are optional).
 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
 cl1 = clahe.apply(img)
 
 cv2.imwrite('clahe_2.jpg',cl1)
มีข้อผิดพลาดในการสร้างรูปย่อ: ไฟล์สูญหาย


Additional Resources

1.Wikipedia page on Histogram Equalization
2.Masked Arrays in Numpy



1.How can I adjust contrast in OpenCV in C?
2.How do I equalize contrast & brightness of images using opencv?