首页 > 解决方案 > 如何在没有任何库但来自 C++ 的标准库的情况下处理图像中的边缘像素?

问题描述

我开发了一个代码,可以读取和处理 24 位 bmp 图像中的位,主要应用过滤器,但现在我想让我的模糊过滤器也模糊边缘像素。现在我有一个 1 像素的边缘,我正在使用 3x3 框模糊,这是应用模糊后得到的图像:

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

如果我在内部循环中使用 if 语句,我可以保留图像中的原始位,但这并没有真正帮助,因为我希望它是模糊的,而不是原始的未模糊位。这是代码:

>

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 个 for 循环非常慢,但我希望能够首先使其正常工作,但如果有任何关于如何改进它的提示,我会全力以赴。现在至于第一个循环,它所做的是将过滤器应用到您想要的次数。接下来的两个是通过vector作为2d vector,里面的2个是box blur。

要知道的重要事项:我有一个位向量(RGB)而不仅仅是像素,这就是为什么我一个一个地处理它们(位),我的向量也是一个一维向量。

标签: c++imageimage-processingblurbmp

解决方案


推荐阅读