Pemrosesan gambar, peregangan linier dan opencv

Pemrosesan gambar, peregangan linier dan opencv

Dalam upaya mengenali objek dengan memeriksa gambar, berbagai pemrosesan gambar dan teknik analisis diterapkan. Artikel ini secara singkat menjelaskan algoritma peregangan linier dan penggunaannya dalam opencv.

Teknik peregangan linier dapat diterapkan pada gambar di mana kurangnya kontras dapat mengakibatkan identifikasi objek yang salah, hubungan dan signifikansinya spasial. Peningkatan kontras dengan peregangan linier dapat diterapkan pada gambar dengan variasi kecerahan yang sangat rendah atau sangat tinggi. Untuk menerapkan algoritma peregangan linier, gambar perlu dikonversi menjadi skala abu-abu dan semua piksel 8bit dan nilainya direkam menjadi histogram.

Histogram akan berisi semua 256 level abu -abu (0 - 255) di tempat yang disebut dan setiap nilai piksel akan terjadi di tempat sampah yang diwakili dengan nilainya sendiri. Saat histogram dan gambar dibuat, nilai maksimum (omax) dan minimum (omin) diidentifikasi.

Stretch linear diterapkan pada histogram sebagai berikut:

  • Buat histogram gambar asli
  • Setel nilai maksimum baru (NMAX) dan minimum baru (NMIN)
  • Hitung jumlah tempat sampah dalam histogram asli di mana nilai nampan = (omax - omin)
  • Hitung jarak untuk histogram baru So Space = (NMAX - NMIN) / (OMAX - OMIN)
  • Buat histogram baru dengan posisi yang sesuai untuk tempat sampah baru (NB) yang diwakili oleh
  • Gunakan histogram baru untuk membuat gambar baru

Formula sebelumnya dapat diwakili dengan versi kode C ++ yang disederhanakan sebagai berikut:

#termasuk menggunakan namespace std; int main () const int nmin = 0; const int nmax = 255; const int omin = 60; const int omax = 65; int space = (nmax - nmin) / (omax - omin); int bin = (omax - omin); untuk (int j = 0; j <= bins; j++ )   std::cout << j + OMIN << ": " << NMIN + ( j * space ) << endl;   return 0; 

MENYUSUN:

G ++ Bins.CPP -O Bins

KELUARAN:

60: 0 61: 51 62: 102 63: 153 64: 204 65: 255 

Kode C ++ di atas benar -benar versi algoritma linear stretch yang disederhanakan. Di bagian selanjutnya kita akan menggunakan perpustakaan opencv untuk melakukan tugas ini.

Menggunakan pustaka opencv kita dapat memanfaatkan fungsi cvnormalize. Fungsi ini mengambil minimum lima argumen (gambar asli, gambar baru, NMIN, NMAX dan tipe normalisasi). Kode OpenCV C ++ berikut mengambil gambar sampel sebagai argumen tunggal. Kode C ++ berikut akan menerapkan fungsi cvnormaliza ke gambar sampel dan membuat histogram untuk gambar asli maupun dinormalisasi.

#include "cv.h "#include" highgui.h "void create_histogram_image (iPlImage*, iPLIMAGE*); int main (int argc, char ** argv) // memuat gambar warna yang ditentukan oleh argumen pertama ilimage*source = cvloadImage (argv [1]); // Buat gambar baru iPLIMAGE* Struktur // Untuk gambar keluaran grayscale iPlImage *Gray_IMG = CVCreateImage (CVSize (Sumber-> Width, Source-> Height), IPL_DEPTH_8U, 1); // Setel Type CV_RGB2Gray untuk mengonversi // gambar RGB ke Grayscale CVCVTCOLOR (Gray, Grayscale CVCVTCOLOR (Gray, Grayscale CVCVTCOLOR (Grayscale (Grayscale CVCVTCOLOR (Grayscale (Grayscale, , Cv_rgb2gray); // Buat struktur gambar baru // untuk menahan gambar histogram iPlImage *hist_img = cvCreateImage (cvsize (300.240), 8, 1); CVSET (hist_img, cvscalarall (255), 0); // Untuk menahan gambar output yang diregangkan iPlImage *peregangan_img = cvCreateImage (cvsize (sumber-> lebar, sumber-> tinggi), iPl_depth_8u, 1); // Buat struktur gambar baru // untuk menahan gambar histogram iPlImage *peregangan_hist_img = cvcreateMage (cvsize (300.240), 8, 1);cvset (peregangan_hist_img, cvscalarall (255), 0); // Buat struktur gambar baru // untuk menahan output output yang diregangkan iPlImage *exonized_img = cvCreateImage (cvsize (sumber-> lebar, sumber-> tinggi), IPL_DEPTH_8U, 1); // CVNormalize Function Call untuk menerapkan linear stretch cvnormalize (Gray_IMG, Stretched_IMG, 0, 255, CV_MINMAX); // Buat histogram gambar asli create_histogram_image (Gray_IMG, hist_img); // Buat histogram gambar baru. create_histogram_image (peregangan_img, peregangan_hist_img); // Tampilkan semua gambar cvnamedWindow ("gambar skala abu-abu asli", 1); cvshowimage ("gambar skala abu-abu asli", Gray_IMG); cvnamedWindow ("gambar skala abu-abu yang diregangkan", 1); cvshowimage ("gambar skala abu-abu peregangan", peregangan_img); cvnamedWindow ("histogram gambar skala abu-abu", 1); cvshowimage ("histogram gambar skala abu-abu", hist_img); cvnamedWindow ("histogram gambar peregangan", 1); cvshowimage ("histogram gambar peregangan", peregangan_hist_img); // tunggu tanpa batas waktu untuk keystroke cvwaitkey (0); kembali 0;  void create_histogram_image (iPlImage* Gray_IMG, iPLIMAGE* hist_img) cvhistogram* hist; int hist_size = 256; rentang float [] = 0,256; float* ranges [] = range; float max_value = 0.0; float w_scale = 0.0#000000; ">; // Buat array untuk menahan nilai histogram hist = cvcreateHist (1, & hist_size, cv_hist_array, ranges, 1); // menghitung nilai histogram cvcalchist (& gray_img, hist, 0, null); / mendapatkan cvcalchist (& gray_img, hist, 0, null)); Nilai minimum dan maksimum histogram cvgetMinmaxhistValue (hist, 0, & max_value, 0, 0); // atur tinggi dengan menggunakan nilai maximim cvscale (hist-> nampan, hist-> nampan, (float) hist_img- tinggi> max_value, 0); // Hitung lebar w_scale = ((float) hist_img-> lebar)/hist_size; // plot histogram untuk (int i = 0; i < hist_size; i++ )   cvRectangle( hist_img, cvPoint((int)i*w_scale , hist_img->tinggi), cvpoint ((int) (i+1)*w_scale, hist_img-> tinggi -cvround (cvgetreal1d (hist-> bins, i))), cvscalar (0), -1, 8, 0);  

MENYUSUN:

G ++ 'PKG-Config Opencv --Cflags --libs' Normalisasi.CPP -o menormalkan 

MENJALANKAN:

./menormalkan sampel.png 

KELUARAN:

Sampel.PNG (gambar RGB asli)

Pada langkah berikutnya kami telah mengubah gambar RGB menjadi skala abu-abu:

Menggunakan Cvnormalize Kami telah menerapkan peregangan linier:

Sekarang kita dapat membandingkan histogram dari kedua gambar.

Histogram gambar skala abu-abu asli:

Histogram gambar baru yang diregangkan:

Tutorial Linux Terkait:

  • Pengantar Otomatisasi Linux, Alat dan Teknik
  • Loop bersarang dalam skrip bash
  • Menguasai loop skrip bash
  • Bagaimana bekerja dengan WooCommerce Rest API dengan Python
  • Hal -hal yang harus diinstal pada ubuntu 20.04
  • Seberapa sering Anda harus me -reboot server linux Anda?
  • Membandingkan Linux Apache Prefork vs Pekerja MPM
  • Hal -hal yang harus dilakukan setelah menginstal ubuntu 20.04 FOSSA FOSSA Linux
  • Mint 20: Lebih baik dari Ubuntu dan Microsoft Windows?
  • Optimalisasi Kinerja Linux: Alat dan Teknik