Saya mencoba menerapkan fungsi yang mengikis gambar tanpa menggunakan fungsi erosi bawaan di opencv.

Pendekatan saya adalah untuk memeriksa apakah ada 0 di area gambar dan jika kernel adalah satu maka saya tidak dapat mengaturnya, yang berarti kondisinya salah. Kemudian pernyataan if kedua saya berarti bahwa kondisinya benar maka 1 saya disetel.

void erosion(const cv::Mat& image, cv::Mat& erosion_image, const cv::Mat& kernel)
{
    bool check;
    int count;
    int count_2;
    int anchorx = kernel.rows / (2.0);
    int anchory = kernel.cols / (2.0);
    for (int x = 0; x < image.rows; x++) {
        for (int y = 0; y < image.cols; y++) {
            kernel.at<uchar>(x, y);
            for (int count = 0; count < kernel.rows; count++) {
                for (int count_2 = 0; count_2 < kernel.cols; count_2++) {

                    if (image.at<uchar>(x + count, y + count_2) == 0 && kernel.at<uchar>(count, count_2) == 1) {

                        check = false;
                    }
                }
            }

            if (check) {

                erosion_image.at<uchar>(x, y) = 1;
            }
        }
    }
}

Apakah ini pendekatan yang tepat? Terima kasih sebelumnya

0
momonosuke 23 Maret 2019, 17:05

1 menjawab

Jawaban Terbaik

Ini adalah definisi erosi untuk citra biner. Jika Anda memproses gambar skala abu-abu, Anda harus menyetel nilai piksel ke nilai minimum titik di lingkungannya Wiki-Erosi.

Dalam kode berikut alih-alih nilai piksel maksimum 1 saya menggunakan 255 - default untuk nilai maksimum OpenCV dari jenis gambar CV_8U.

Catatan, Anda juga harus memilih cara memproses piksel batas gambar. Dalam kode berikut mereka tidak diproses. Erosi untuk citra biner dapat direpresentasikan sebagai sesuatu seperti itu:

void erosion(const cv::Mat& image, cv::Mat& erosion_image, const cv::Mat& kernel)
{
    bool check;
    int count;
    int count_2;
    int anchorx = kernel.rows / (2.0);
    int anchory = kernel.cols / (2.0);
    for (int x = anchorx; x < image.rows - anchorx; x++) {
        for (int y = anchory; y < image.cols - anchory; y++) {
            check = true;
            if (image.at<uchar>(x, y))
            {
                for (int count = 0; count < kernel.rows && check; count++) {
                    for (int count_2 = 0; count_2 < kernel.cols && check; count_2++) {

                        if (image.at<uchar>(x - anchorx + count, y - anchory + count_2) == 0 &&
                            kernel.at<uchar>(count, count_2) == 1) {
                            erosion_image.at<uchar>(x, y) = 0;
                            check = false;
                        }
                    }
                }

                if (check) 
                    erosion_image.at<uchar>(x, y) = 255;
            }
            else
                erosion_image.at<uchar>(x, y) = 0;
        }
    }
}
0
ant-Korn 23 Maret 2019, 20:40