Pemprosesan imej, regangan linear dan opencv
- 4945
- 106
- Clay Weber
Dalam usaha untuk mengenali objek dengan mengkaji imej, pelbagai teknik pemprosesan imej dan analisis digunakan. Artikel ini secara ringkas menggambarkan algoritma regangan linear dan penggunaannya dalam openCV.
Teknik regangan linear boleh digunakan pada imej di mana kekurangan kontras yang besar dapat mengakibatkan pengenalpastian objek palsu, hubungan dan kepentingannya. Peningkatan kontras dengan regangan linear boleh digunakan pada imej dengan variasi kecerahan yang sangat rendah atau sangat tinggi. Untuk menggunakan algoritma regangan linear, imej perlu ditukar menjadi skala kelabu dan semua piksel 8bit dan nilai-nilainya direkodkan menjadi histogram.
Histogram akan mengandungi semua 256 peringkat kelabu (0 - 255) dalam tong yang dipanggil dan setiap nilai piksel akan berlaku di dalam tong yang diwakili dengan nilainya sendiri. Apabila histogram dan imej dicipta, nilai maksimum (Omax) dan minimum (omin) dikenal pasti.
Peregangan linear digunakan untuk histogram seperti berikut:
- Buat histogram gambar asal
- Tetapkan nilai maksimum (Nmax) dan minimum baru (NMIN) baru
- Kirakan bilangan tong sampah dalam histogram asal di mana nilai tong = (Omax - omin)
- Kirakan jarak untuk histogram baru jadi ruang = (nmax - nmin) / (imax - omin)
- Buat histogram baru dengan kedudukan yang sepadan untuk tong baru (NB) yang diwakili oleh
- Gunakan histogram baru untuk membuat gambar baru
Formula sebelumnya boleh diwakili oleh versi C ++ versi mudah seperti berikut:
#termasuk menggunakan ruang nama std; int main () const int nmin = 0; const int nmax = 255; const int omin = 60; const int oMAX = 65; int ruang = (nmax - nmin) / (imax - omin); int tong = (Omax - omin); untuk (int j = 0; j <= bins; j++ ) std::cout << j + OMIN << ": " << NMIN + ( j * space ) << endl; return 0;
Menyusun:
G ++ tong sampah.CPP -O tong sampah
PENGELUARAN:
60: 0 61: 51 62: 102 63: 153 64: 204 65: 255
Kod C ++ di atas adalah versi yang benar -benar dipermudahkan dari algoritma regangan linear. Di bahagian seterusnya kami akan menggunakan perpustakaan OpenCV untuk melakukan tugas ini.
Menggunakan perpustakaan OpenCV kita boleh memanfaatkan fungsi cvnormalize. Fungsi ini mengambil minimum lima argumen (imej asal, imej baru, NMIN, NMAX dan jenis normalisasi). Kod OpenCV C ++ berikut mengambil gambar sampel sebagai satu hujah. Kod C ++ berikut akan menggunakan fungsi cvNormalize ke imej sampel dan membuat histogram untuk imej asal dan normal.
#include "cv.H "#include" highgui.h "void create_histogram_image (iplimage*, ipleMage*); int main (int argc, char ** argv) // imej warna beban yang ditentukan oleh argumen pertama iplimage*source = cvloadimage (argv [1]); // buat imej baru struktur // untuk imej output kelabu Iplimage *gray_img = cvcreateimage (cvsize (source-> width, source-> height), ipl_depth_8u, 1); // set jenis cv_rgb2gray untuk menukar // rgb ke grayscale , Cv_rgb2gray); // buat struktur imej baru // untuk memegang imej histogram iplimage *hist_img = cvcreateimage (cvsize (300,240), 8, 1); cvset (hist_img, cvscalarAll (255), 0); / (300,240), 8, 1);cvset (stretched_hist_img, cvscalarall (255), 0); // Buat struktur imej baru // untuk memegang imej output yang diregangkan iplimage *disamakan_img = cvcreateimage (cvsize (source-> width, source-> height), ipl_depth_8u, 1); // CvNormalize Fungsi Panggilan untuk memohon regangan linear cvnormalize (Gray_img, stretched_img, 0, 255, cv_minmax); // membuat histogram imej asal create_histogram_image (kelabu_img, hist_img); // Buat histogram gambar baru. create_histogram_image (stretched_img, stretched_hist_img); // Paparkan semua imej cvnamedWindow ("Imej Skala Kelabu Asal", 1); cvShowImage ("Imej Skala Kelabu Asal", Gray_img); cvnamedWindow ("Imej berskala kelabu yang diregangkan", 1); cvshowimage ("imej berskala kelabu yang diregangkan", stretched_img); cvnamedWindow ("histogram imej skala kelabu", 1); cvshowimage ("histogram imej skala kelabu", hist_img); cvnamedWindow ("Histogram imej yang diregangkan", 1); cvShowImage ("Histogram imej yang diregangkan", stretched_hist_img); // tunggu selama -lamanya untuk kekunci cvwaitkey (0); kembali 0; void create_histogram_image (iplimage* gray_img, iplimage* hist_img) cvhistogram* hist; int hist_size = 256; Float Range [] = 0,256; float* ranges [] = range; float max_value = 0.0; float w_scale = 0.0#000000; ">; // Buat array untuk memegang nilai histogram hist = cvcreatehist (1, & hist_size, cv_hist_array, julat, 1); // hitung nilai histogram cvcalchist (& gray_img, hist, 0, null); Nilai minimum dan maksimum histogram cvgetminmaxhistValue (hist, 0, & max_value, 0, 0); // set ketinggian dengan menggunakan nilai maksimim cvscale (hist-> tong, hist-> tong, (float) hist_img-> ketinggian)/ max_value, 0); // hitung lebar w_scale = ((float) hist_img-> width)/hist_size; // plot histogram untuk (int i = 0; < hist_size; i++ ) cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->ketinggian), cvpoint ((int) (i+1)*w_scale, hist_img-> ketinggian -cvround (cvgetReal1d (hist-> tong, i))), cvscalar (0), -1, 8, 0);
Menyusun:
G ++ 'PKG-CONFIG OPENCV-FFLAGS-LIBS' Normalisasi.CPP -O normalisasi
Jalankan:
./menormalkan sampel.png
PENGELUARAN:
Contoh.PNG (imej RGB asal)
Dalam langkah seterusnya kami telah menukar imej RGB ke skala kelabu:
Menggunakan cvnormalize kami telah menggunakan regangan linear:
Sekarang kita dapat membandingkan histogram kedua -dua gambar.
Histogram imej berskala kelabu yang asal:
Histogram imej baru yang diregangkan:
Tutorial Linux Berkaitan:
- Pengenalan kepada Automasi, Alat dan Teknik Linux
- Gelung bersarang dalam skrip bash
- Menguasai Gelung Skrip Bash
- Cara Bekerja Dengan API Rest WooCommerce dengan Python
- Perkara yang hendak dipasang di Ubuntu 20.04
- Berapa kerap anda perlu reboot pelayan Linux anda?
- Membandingkan Linux Apache Prefork vs Pekerja MPMS
- Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
- Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
- Pengoptimuman Prestasi Linux: Alat dan Teknik