Перебирать регионы и принимать среднее значение пикселя в OpenCV?

Итак, я в основном пытаюсь разделить изображение в градациях серого (в данном случае 32x32), изменив размер исходного изображения.

Как только «области» разделены, мне нужно взять среднее значение пикселя каждой из них, а затем добавить к строке 1, 0 или X. Например: «Область (3, 19) имеет среднее значение 21 так это 1".

Я думаю, что у меня есть большая часть логики, но теоретически не должен ли вывод воссоздавать изображение в виде 1, 0 и X? Я чувствую, что моя математика неверна для циклов, может быть? Помните, что все, что я пытаюсь сделать, это разбить изображение на таблицу или сетку MxN и взять среднее значение канала 0 для каждой области сетки.

Вот мой код:

Mat image = imread("blackdot.jpg", IMREAD_GRAYSCALE); //Pass in image
imshow("Gray scaled image", image);                     //imshow("Passed in gray scale image", image);

Mat resizedImage; // New Mat for saving the blown up image
resize(image, resizedImage, Size(3200, 3200)); // Blow up image so it's divisible by 32 using passed in image

string bitStream; // Ternary bitstream 

for (int y = 0; y<resizedImage.cols - 32; y += 32) {
    for (int x = 0; x<resizedImage.rows - 32; x += 32) {
        // get the average for the whole 32x32 block
        Rect roi(x, y, 32, 32);
        Scalar mean, dev;
        meanStdDev(resizedImage(roi), mean, dev); // mean[0] is the mean of the first channel, gray scale value;

        if (mean[0] >= 0 && mean[0] <= 25) {
            if ((counter % 3200) == 2900) {
                bitStream += "1\n";
                counter = 0;
            }
            else {
                bitStream += "1";
        }
        else if (mean[0] >= 77 && mean[0] <= 153) {
            if ((counter % 3200) == 2900) {
                bitStream += "X\n";
                counter = 0;
            }
            else {
                bitStream += "X";
        }
        else {
            if ((counter % 3200) == 2900) {
                bitStream += "0\n";
                counter = 0;
            }
            else {
                bitStream += "0";
        }
    }
}

cout << bitStream;

blackdot.jpg


person CrowHop    schedule 20.03.2018    source источник
comment
В вашем примере регион (3, 19) имеет среднее значение 63, поэтому 1 не соответствует вашему коду. 63 сопоставляется с 0. Пожалуйста, загрузите исходное изображение, покажите нам результат и расскажите, почему оно отличается от того, что вы ожидаете.   -  person Cris Luengo    schedule 20.03.2018
comment
Ну это просто гипотетический пример. Я загрузил изображение blackdot.jpg для справки. Также изменено объяснение примера, чтобы оно соответствовало логике.   -  person CrowHop    schedule 20.03.2018
comment
добавить \n к битовому потоку для каждой обработанной строки, чтобы правильно выровнять вывод   -  person jackw11111    schedule 21.03.2018
comment
Это то, что я пытаюсь сделать, но это все не в порядке. Я обновил свой код, чтобы показать вам, что у меня есть.   -  person CrowHop    schedule 21.03.2018


Ответы (1)


Код и логика выглядят хорошо, для каждого распределения пикселей добавьте соответствующий символ в битовый поток и повторите это для всех пикселей в строке и для каждого столбца изображения.

При добавлении символов в битовый поток попробуйте добавить \n к битовому потоку при достижении новой строки (т. е. когда строка завершена), чтобы учесть в битовом потоке выравнивание изображения. Это соответствует этой незначительной корректировке в вашем коде:

for (int y = 0; y<resizedImage.cols - 32; y += 32) {
    for (int x = 0; x<resizedImage.rows - 32; x += 32) {
        // get the average for the whole 32x32 block
        Rect roi(x, y, 32, 32);
        Scalar mean, dev;
        meanStdDev(resizedImage(roi), mean, dev); // mean[0] is the mean of the first channel, gray scale value;

        if (mean[0] >= 0 && mean[0] <= 25) {
            bitStream += "1";
        }
        else if (mean[0] >= 77 && mean[0] <= 153) {
            bitStream += "X";
        }
        else {
            bitStream += "0";
        }
    }
    //after each row has been checked, add newline
    bitStream += '\n';
}

Примечание. Окно вывода может потребоваться развернуть, чтобы увидеть правильные результаты.

person jackw11111    schedule 21.03.2018
comment
Это сделало это! Это такое простое решение. Большое спасибо. - person CrowHop; 22.03.2018