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

Поэтому я в основном пытаюсь разделить серое изображение (в данном случае 32×32) путем изменения размера исходного изображения.

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

Я думаю, что у меня есть большая часть логики, но теоретически вывод не должен воссоздать изображение в форме 1, 0 и X? Я чувствую, что моя математика не подходит для циклов for, может быть? Помните, все, что я пытаюсь сделать, это разбить изображение на таблицу или сетку 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

0

Решение

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

При добавлении символов в битовый поток попробуйте добавить \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';
}

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]