c++ - 如何在没有任何库但来自 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)而不仅仅是像素,这就是为什么我一个一个地处理它们(位),我的向量也是一个一维向量。
解决方案
推荐阅读
- wpf - 按控件类型查找资源的 FindResource 等价物是什么?
- list - 如何创建一个包含 n 个过程应用程序的列表
- javascript - 从数组中提取最后 n 个元素而不干扰原始数组
- javascript - 更改 Redux 中的存储
- java - Android中是否有任何有效的方法来缩小文件中的大图像并将其保存到新文件而不会出现OOM异常
- java - 如何与批处理进行通信?
- spark-java - Spark 可以支持每条路由多少个并发请求?
- php - Symfony 中的简单查询返回 null
- header - Zip 是否使用字典进行压缩?是否可以提取该字典并将其转储到文本文件中?
- youtube-api - Youtube API - 允许订阅用户,但次日取走