Langsung ke konten utama

OpenCV Tutorial - Sobel Edge-Detection

Halo semuanya, kali ini saya ingin bagi-bagi ilmu mengenai pemrosesan citra digital. Ini sih sebenarnya tuntutan kuliah juga, tapi apa salahnya saya taro di blog saya.

Kali ini saya ingin share tentang Sobel Edge-Detection SECARA MANUAL (tidak menggunakan fungsi yang sekali panggil langsung dapat). Hasilnya ntar akan seperti ini gan

Hasil Sobel edge-detection
Hasil Sobel edge-detection

Yak, langsung saja, ini dia kodingannya.

#include 
#include 
#include 
#include 

using namespace std;

//Fungsi untuk menghitung gradien terhadap suatu sumbu
void hitungSobelAxis(CvMat *matInput, CvMat *output, int x[3][3] ) {
    
    int temp;

    for (int i = 1; i < matInput->rows - 1; i++) {
        for (int j = 1; j < matInput -> cols - 1; j++) {
                //Hitung hasil masking
            temp = (cvGetReal2D(matInput, i-1, j-1) * x[0][0]) + (cvGetReal2D(matInput, i-1, j) * x[0][1]) + (cvGetReal2D(matInput, i-1, j+1) * x[0][2])
                    + (cvGetReal2D(matInput, i, j-1) * x[1][0]) + (cvGetReal2D(matInput, i, j) * x[1][1]) + (cvGetReal2D(matInput, i, j+1) * x[1][2])
                    + (cvGetReal2D(matInput, i+1, j-1) * x[2][0]) + (cvGetReal2D(matInput, i+1, j) * x[2][1]) + (cvGetReal2D(matInput, i+1, j+1) * x[2][2]);
                //Masukkan hasil masking pada output citra
            cvSetReal2D(output, i-1, j-1, temp);
        }
    }
}

//Setelah menghitung gradien x dan y, hitung Magnitude
void hitungSobel(CvMat *x, CvMat *y, CvMat *hasil) {
    for (int i = 0; i < hasil-> rows; i++) {
        for (int j = 0; j < hasil->cols; j++) {
            //hitung magnitude
            cvSetReal2D(hasil, i, j,
                        //Magnitude = |Gx| = sqrt(Gx^2 + Gy^2)
                        sqrt(cvGetReal2D(x, i, j) * cvGetReal2D(x, i, j) +
                                          cvGetReal2D(y, i, j) * cvGetReal2D(y, i, j))
                        );
        }
    }
}

void threshold(CvMat *in) {
    for (int i=0; i rows; i++)
    {
        for (int j=0; jcols; j++)
        {
            //Jika nilai pixel citra asli < 128
            //Ubah menjadi 0 (hitam)
            if (cvGetReal2D(in, i, j) < 128)
            {
                cvSetReal2D(in, i, j, 0);
            }

            //Jika nilai pixel citra asli >= 128
            //Ubah menjadi 255 (putih)
            else
            {
                cvSetReal2D(in, i, j, 255);
            }
        }
    }
}

//Fungsi menampilkan citra
void tampilkan(CvMat *out, char* stringTemp) {
    cvNamedWindow(stringTemp, CV_WINDOW_AUTOSIZE);
    cvShowImage(stringTemp, out);
}


int main()
{
    CvMat *matInput = cvLoadImageM("cat.jpg", CV_LOAD_IMAGE_GRAYSCALE);
    CvMat *outX, *outY, *out;

    char *original = "Original";
    char *stringX = "Hasil X";
    char *stringY = "Hasil Y";
    char *stringHasil = "Hasil";

    //untuk citra gradien
    outX = cvCreateMat(matInput->rows - 1, matInput->cols - 1, CV_8U);
    outY = cvCreateMat(matInput->rows - 1, matInput->cols - 1, CV_8U);
    
    //untuk citra hasil edge-detection
    out = cvCreateMat(matInput->rows - 1, matInput->cols - 1, CV_8U);

    //Kernel sumbu X dan sumbu Y
    int kernelX[3][3] = {{-1,0,1}, {-2,0,2}, {-1,0,1}};
    int kernelY[3][3] = {{-1,-2,-1}, {0,0,0}, {1,2,1}};

    hitungSobelAxis(matInput, outX, kernelX);
    hitungSobelAxis(matInput, outY, kernelY);

    hitungSobel(outX, outY, out);

    tampilkan(matInput, original);
    threshold(out);
    tampilkan(out, stringHasil);

    cvWaitKey(0);
}


Kalau ada yang ingin ditanyakan, komen saja ya gan (bisa, tidak bisa jawab tidak dijamin :P)

Komentar

Postingan populer dari blog ini

Mengubah Repository Linux Menjadi Repository Lokal

Hlo teman-teman, pengen nge-share lagi nihh.. Baru-baru ini saya menginstall Deepin Linux, karena melihat UI cantiknya, dan saya juga mulai tertarik ke yang berbasis open source. Instalasi OS ini sangat mudah dan tidak make yang ribet-ribet. Hsilnya juga cantik kok.

PHP Tutorial - Menjalankan Program .exe "Hello World!" Melalui PHP

Hai semua, saya ingin berbagi ilmu yang saya dapatkan sambil mengerjakan skripsi saya. Pernah tidak, kalian sudah bikin suatu program keren menggunakan bahasa C/C++, tapi kalian harus menjalankannya di SERVER??? Contoh kasus yang membuat Anda melakukan ini apa? Contoh sederhananya membuat Web Service. Di mana operasi perhitungan service yang ditawarkan menggunakan bahasa C/C++. Kalau misal kalian mau bikin make PHP dari awal web servicenya, sebenarnya tidak apa-apa juga, tapi kalau misalkan sudah ada program C/C++-nya, mending make yang sudah ada daripada buat dari awal lagi kan??? :)

Inkscape tutorial - Pembuatan Bola Biliar yang Tampak 3D

Salah satu dari aspek design yang sangat populer sekarang ini adalah pembuatan gambar 3D. Lebih dari satu teknik dapat digunakan untuk membuat gambar 3D. Bahkan gambar 2D bisa dibuat terlihat 3D. Di sini saya akan menunjukkan bagaimana membuat bola biliar tapi yang tampak tiga dimensi menggunakan Inkscape. Ini adalah materi yang saya pelajari dan kopas dari sini . Langkah-langkahnya adalah sebagai berikut: - Buat sebuah lingkaran dengan memilih circle tool. Agar lingkarannya tidak asal, buatlah sambil menekan Ctrl. - Hilangkan stroke-nya dengan klik kanan pada warna stroke di bagian bawah, kemudian pilih Remove Stroke. - Ganti warna lingkaran tersebut dengan warna dasar bola yang kalian inginkan. Di sini saya menggunakan warna coklat tua. - Pilih gradient tool (Ctrl+F1), dan pastikan kalian memilih tombol gradasi radialnya pada bagian atas jendela kalian setelah kalian memilih gradient tool. - Pastikan lingkaran bawah yang terpilih setelah kalian melakukan gr...