Histograms - 2: Histogram Equalization
วัตถุประสงค์
- เราจะได้เรียนรู้แนวคิดของเท่าเทียมกัน Histogram และใช้ในการปรับปรุงความคมชัดของภาพของเรา
ทฤษฎี
พิจารณาภาพที่มีค่าพิกเซลที่ถูกกำหนดให้อยู่ช่วงเฉพาะบางส่วนของค่าเท่านั้น สำหรับภาพที่สดใสจะมีพิกเซลทั้งหมดกำหนดค่าที่สูง ดังนั้นคุณจำเป็นต้องยืด histogram นี้ไปจนสูงสุดเท่านั่น (ตามที่กำหนดในภาพด้านล่าง) และเป็นสิ่งที่ไม่เท่าเทียมกัน Histogram (ในคำง่าย) นี้ปกติจะช่วยเพิ่มความคมชัดของภาพ
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 ทั่วโลก
มันเป็นความจริงที่พื้นหลังคมชัดขึ้นหลังจากที่เท่าเทียมกัน 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?