Как мне обработать краевые пиксели изображения без каких-либо библиотек, кроме стандартных из C ++? - PullRequest
0 голосов
/ 01 мая 2020

Я разработал код, который может считывать и обрабатывать биты из 24-битного изображения в формате bmp, в основном применяя фильтры, но теперь я хочу, чтобы мой фильтр размытия также размыл краевые пиксели. Прямо сейчас у меня есть край 1 пикселя, я использую размытие 3x3, и это изображение, которое я получаю после применения размытия:

https://i.stack.imgur.com/0Px6Z.jpg

Я могу сохранить исходные биты из изображения, если я использую оператор if во внутреннем l oop, но это не очень помогает, учитывая, что я хочу, чтобы он был размытым, а не исходными не размытыми битами. Вот код:

>

for (int count = 0; count < times; ++count) {
    for (int x = 1; x < H-1; ++x) {
        for (int y = 1; y < W-1; ++y) {
            double sum1 = 0;
            double sum2 = 0;
            double sum3 = 0;
            for (int k = -1; k <= 1; ++k) {
                for (int j = -1; j <= 1; ++j) {
                    sum1 += bits[((x - j) * W + (y - k)) * 3] * kernel[j + 1][k + 1];
                    sum2 += bits[((x - j) * W + (y - k)) * 3 + 1] * kernel[j + 1][k + 1];
                    sum3 += bits[((x - j) * W + (y - k)) * 3 + 2] * kernel[j + 1][k + 1];

                }
            }
            if (sum1 <= 0) sum1 = 0;
            if (sum1 >= 255) sum1 = 255;
            if (sum2 <= 0) sum2 = 0;
            if (sum2 >= 255) sum2 = 255;
            if (sum3 <= 0) sum3 = 0;
            if (sum3 >= 255) sum3 = 255;
            temp[(x * W + y) * 3] = sum1;
            temp[(x * W + y) * 3 + 1] = sum2;
            temp[(x * W + y) * 3 + 2] = sum3;

        }
    }
    bits = temp;
}

Я знаю, что 5 для вложенных циклов очень медленные, но я бы хотел сначала сделать так, чтобы все работало правильно, но если есть Советы о том, как улучшить это я все уши. Теперь, что касается первого l oop, он применяет фильтр столько раз, сколько вы хотите. Следующие два - это go через вектор как двумерный вектор, а внутренний 2 - для размытия рамки.

Важные вещи, которые необходимо знать: у меня есть вектор битов (RGB), а не только пикселей, поэтому я обрабатываю их один за другим (биты), также мой вектор является 1d-вектором.

...