C++中的Box滤波算法
Box Filtering Algorithm in C++
我正在使用框过滤算法来进行RGB图像模糊。但结果真的很糟糕。我根本认不出原来的图像。图像的数据存储在阵列Data[Width*Height*3]
中,顺序为BGRBGRBGR。。。kernel
是一个9x9的盒子。
这是我的盒子过滤功能:
void MyImage::BoxFiltering(vector<int> kernel){
char *temp = new char[Width * Height * 3];
int denominator = 0;
int indexOffset;
int red = 0, blue = 0, green = 0;
int indices[] = {-(Width + 1), -Width, -(Width - 1),
- 1, 0, 1,
Width - 1, Width, Width + 1};
for(int i = 0; i < kernel.size(); ++i){
denominator += kernel[i];
}
if(denominator == 0)
denominator = 1;
//Copy Data
for(int i = 0; i < Width * Height * 3; ++i){
temp[i] = Data[i];
}
for(int i = 1; i < Height - 1; ++i){
for(int j = 1; j < Width - 1; ++j){
//Get Pixel Index
indexOffset = getIndex(j, i);
for(int k = 0; k < kernel.size(); ++k){
blue += Data[3 * (indexOffset + indices[k])] * kernel[k];
green += Data[3 * (indexOffset + indices[k]) + 1] * kernel[k];
red += Data[3 * (indexOffset + indices[k]) + 2] * kernel[k];
}
temp[3 * indexOffset] = static_cast<char>(blue / denominator);
temp[3 * indexOffset + 1] = static_cast<char>(green / denominator);
temp[3 * indexOffset + 2] = static_cast<char>(red / denominator);
}
}
for(int i = 0; i < Width * Height * 3; ++i){
Data[i] = temp[i];
}
delete [] temp;
}
有人能帮我弄清楚我的实现出了什么问题吗?谢谢
问题已解决。我忘了取回较低的8位并夹住颜色。在这里张贴代码,以备有人需要!
for(int i = 1; i <= Height - 1; ++i){
for(int j = 1; j <= Width - 1; ++j){
//Get Pixel Index
indexOffset = getIndex(j, i);
for(int k = 0; k < kernel.size(); ++k){
blue += (Data[3 * (indexOffset + indices[k])] * kernel[k]) & 0xff;
green += (Data[3 * (indexOffset + indices[k]) + 1] * kernel[k]) & 0xff;
red += (Data[3 * (indexOffset + indices[k]) + 2] * kernel[k]) & 0xff;
}
blue /= denominator;
green /= denominator;
red /= denominator;
if (red>0xff)
red = 0xff ;
else if (red<0)
red = 0 ;
if (green>0xff)
green = 0xff ;
else if (green<0)
green = 0 ;
if (blue>0xff)
blue = 0xff ;
else if (blue<0)
blue = 0 ;
temp[3 * indexOffset] = static_cast<char>(blue);
temp[3 * indexOffset + 1] = static_cast<char>(green);
temp[3 * indexOffset + 2] = static_cast<char>(red);
}
}
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- KMP算法和LPS表构造的运行时间
- 为什么我的排序算法会更改数组值
- 求最大元素位置的分治算法
- 具有非整数边容量的最大流量的Dinic算法
- 到连接组件算法的问题(递归)
- STL算法函数在多个一维容器上的使用
- 读取最后一行代码算法 - c++ 时出现问题
- 括号更改 O(n) 算法
- std::unordered_map 搜索算法是如何实现的?
- 如何实现高效的算法来计算大型数据集的多个不同值?
- C++中的Box滤波算法