peningkatan imej dengan python: tutorial penyamaan histogram
Pernah kecewa dengan imej yang berkualiti rendah? Bayangkan meningkatkan imej itu untuk mendedahkan butiran tajam dan kejelasan yang lebih baik. Tutorial ini menunjukkan kepada anda bagaimana untuk mencapai ini menggunakan python dan kuasa penyamaan histogram.
penyamaan histogram adalah teknik yang meningkatkan kontras imej. Ini adalah proses asas yang digunakan dalam hampir semua sistem kamera untuk meningkatkan kualiti imej, dan pada akhir tutorial ini, anda akan faham mengapa.
kita akan meneroka apa histogram dan penyamaan histogram, bagaimana ia mempengaruhi imej, dan kemudian melaksanakan teknik di Python. Mari kita mulakan!
Memahami histogram imej
Histogram secara visual mewakili pengedaran data berangka. Paksi x menunjukkan julat data (tong), dan paksi y memaparkan kekerapan nilai dalam setiap bin.
Dalam pemprosesan imej, setiap piksel mempunyai warna dan intensiti. Warna biasanya diwakili oleh nilai saluran merah, hijau, dan biru (RGB), dari 0 (tiada warna) hingga 255 (warna penuh). Histogram untuk saluran warna menunjukkan kekerapan setiap nilai intensiti (0-255) untuk saluran tersebut. Imej skala kelabu mempunyai histogram tunggal kerana nilai RGB adalah sama untuk setiap piksel.
Imej dengan histogram tertumpu dalam julat intensiti sempit sering kekurangan kejelasan dan perincian. Imej yang seimbang mempamerkan pengedaran intensiti yang lebih luas, lebih banyak lagi.
Apakah penyamaan histogram?
Penyamaan histogram membentangkan histogram imej untuk menggunakan julat intensiti penuh. Ini bermakna menyebarkan nilai intensiti untuk memasukkan kedua -dua kawasan gelap dan cahaya, mengakibatkan kontras yang lebih tinggi dan penglihatan terperinci yang lebih baik. Walaupun tidak selalu sesuai untuk fotografi standard, tidak ternilai dalam aplikasi yang memerlukan perincian yang dipertingkatkan, seperti pengimejan satelit atau haba.
kami akan menggunakan imej monyet skala kelabu (dengan kontras yang dikurangkan) sebagai contoh:
mari kita periksa cara mengakses nilai intensiti piksel menggunakan python dan opencv:
import cv2, random img = cv2.imread('monkey.jpg') img_shape = img.shape height = img_shape[0] width = img_shape[1] for row in range(width): for column in range(height): if random.randint(0, width) == row and row: print(img[column][row])
mewakili intensiti 113 untuk setiap saluran. [113 113 113]
menggunakan kod dari artikel histogram imej yang berasingan, histogram untuk imej contoh kami kelihatan seperti ini:
Histogram ini menunjukkan pengedaran di seluruh saluran BGR. Output sampel dari kod nilai piksel menunjukkan nilai intensiti yang konsisten merentasi saluran:
import cv2, random img = cv2.imread('monkey.jpg') img_shape = img.shape height = img_shape[0] width = img_shape[1] for row in range(width): for column in range(height): if random.randint(0, width) == row and row: print(img[column][row])
penyamaan histogram bertujuan untuk meratakan histogram ini, mengedarkan intensiti lebih merata merentasi julat.
Menganalisis kekerapan intensiti
kod python ini mengira kekerapan intensiti piksel:
<code>[113 113 113] [110 110 110] [106 106 106] ...</code>
output menunjukkan nilai intensiti yang paling kerap dan kiraan mereka, menonjolkan kepekatan dalam julat terhad.
Melaksanakan penyamaan histogram dalam python
Kami akan menggunakan fungsi OpenCV equalizeHist()
, tetapi ia hanya berfungsi pada imej skala kelabu. Oleh itu, kita akan menukar ke ruang warna YUV, menyamakan saluran Y (luminance), dan menukar kembali ke BGR:
import cv2 img = cv2.imread('monkey.jpg') img_shape = img.shape height = img_shape[0] width = img_shape[1] frequency = {} for row in range(width): for column in range(height): intensity = img[column][row][0] count = frequency.get(intensity, 0) frequency[intensity] = count + 1 print("Unique Intensities", len(frequency)) most_frequent = dict(sorted(frequency.items(), key=lambda elem: elem[1], reverse=True)) intensity_values = most_frequent.keys() i = 0 for intensity in intensity_values: i += 1 if i <= 5: print(intensity, most_frequent[intensity])
Contoh dan hasil lengkap
inilah kod lengkap:
import cv2 import numpy img = cv2.imread('monkey.jpg') img_to_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV) img_to_yuv[:, :, 0] = cv2.equalizeHist(img_to_yuv[:, :, 0]) hist_equalization_result = cv2.cvtColor(img_to_yuv, cv2.COLOR_YUV2BGR) cv2.imwrite('result.jpg', hist_equalization_result)
Imej yang dihasilkan (result.jpg
):
Imej yang dipertingkatkan menunjukkan kejelasan yang lebih baik. Histogram imej yang dipertingkatkan adalah rata, menunjukkan pengagihan intensiti. Analisis kekerapan intensiti juga akan menunjukkan lebih banyak pengagihan nilai.
Kesimpulan
Tutorial ini menunjukkan bagaimana untuk meningkatkan kontras imej menggunakan penyamaan histogram dalam python dengan OpenCV. Hasilnya menyerlahkan keberkesanan teknik ini dalam meningkatkan kualiti imej dan penglihatan terperinci. Histogram flatter yang dihasilkan mengesahkan pengagihan semula intensiti piksel yang berjaya.
Atas ialah kandungan terperinci Penyamaan histogram dalam python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!