OpenCV merupakan suatu library yang menyediakan banyak fitur-fitur menarik. Salah satunya adalah membuat efek negative pada citra. Namun pada postingan ini, saya tidak akan menjelaskan cara melakukannya menggunakan library OpenCV secara langsung, saya akan membagi cara bagaimana melakukannya secara MANUAL. Ini sih sebenarnya tuntutan kuliah, hehe ;)
Berikut ini adalah kodingannya
Ok, sekarang akan saya jelaskan maksud dari pemrograman diatas apa.Negative Image |
Berikut ini adalah kodingannya
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
CvMat *cvMat = cvLoadImageM("cameraman.jpg", CV_LOAD_IMAGE_GRAYSCALE);
for (int i = 0;i< cvMat->rows; i++)
{
for (int j=0;j<cvmat->cols;j++)
{
cvSetReal2D(cvMat, i, j, (255-cvGetReal2D(cvMat, i, j)));
}
}
cvShowImage("Hasil", cvMat);
cvWaitKey(0);
cvReleaseMat(&cvMat);
return 0;
}
Hal pertama yang kita lakukan adalah me-load citra yang kita inginkan dalam bentuk grayscale. Tapi yang kita load adalah matriks citra tersebut. Kenapa begitu? Karena apabila kita ingin memberikan efek negative pada suatu citra secara manual, kita harus bisa memanipulasi pixels-pixels-nya secara langsung.
Kemudian pada looping itu kita telusuri satu per satu pixels dari citra yang kita load tadi dan langsung kita manipulasikan pixels-pixels-nya.
Contoh Negative Image + Rumus |
Gambar diatas merupakan contoh Negative Image beserta rumusnya. Intinya, nilai maksimal dari suatu pixel grayscale (255) dikurangi dengan nilai pixel citra yang asli. Ada juga yang menggunakan 127 sebagai operand pertama, tapi saya menggunakan 255. Untuk kasus gambar RGB tidak saya jelaskan di sini.
Nah, itulah yang sebenarnya dilakukan program di dalam loop. dia mengambil nilai pixel yang ada pada baris i, kolom j dari gambar asli dan menguranginya dengan nilai 255
(255-cvGetReal2D(cvMat, i, j))
Setelah itu, nilai yang diperoleh akan dimasukkan pada matriks gambar original kita tadi pada koordinat yang sama.
cvSetReal2D(cvMat, i, j, (255-cvGetReal2D(cvMat, i, j)));
Kalau misalnya bingung, ini saya kasih program yang sama tapi menggunakan dua matriks, satu untuk input, satu lagi untuk hasil. Saya rasa ini sudah jelas jadi tidak perlu saya jelaskan lagi ya. :)
#include
#include
#include
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
CvMat *cvMat = cvLoadImageM("cameraman.jpg", CV_LOAD_IMAGE_GRAYSCALE);
CvMat *out = cvCreateMat(cvMat->rows, cvMat -> cols, cvMat->type );
for (int i = 0;i< cvMat->rows; i++)
{
for (int j=0;j<cvmat->cols;j++)
{
cvSetReal2D(out, i, j, (255-cvGetReal2D(cvMat, i, j)));
}
}
cvShowImage("Hasil", out);
cvWaitKey(0);
cvReleaseMat(&cvMat);
cvReleaseMat(&out);
return 0;
}
Pada baris kedua, yang kita lakukan adalah membuat matrix dengan jumlah baris dan kolom dan tipe yang sama dengan citra original. Saya yakin ini sudah jelas kenapa :)
Semoga bermanfaat ya tutorial OpenCV saya ini. :)
EmoticonEmoticon