gpt4 book ai didi

c++ - Alpha 修整过滤器的问题

转载 作者:太空宇宙 更新时间:2023-11-03 23:15:46 24 4
gpt4 key购买 nike

我正在尝试在 openCV 库中制作一个 alphatrimmed 过滤器。我的代码无法正常工作,并且生成的图像在过滤后看起来不像图像。过滤器应按以下方式工作。

  1. 在我的示例中选择了一些(数组)像素,它是 9 像素的“3x3”窗口。
  2. 以递增的方式对它们进行排序。
  3. 为 alpha-2 切割我们的“阵列”两侧。
  4. 计算剩余像素的算术平均值并将它们插入适当的位置。

int alphatrimmed(Mat img, int alpha)
{
Mat img9 = img.clone();
const int start = alpha/2 ;
const int end = 9 - (alpha/2);

//going through whole image
for (int i = 1; i < img.rows - 1; i++)
{
for (int j = 1; j < img.cols - 1; j++)
{
uchar element[9];
Vec3b element3[9];
int k = 0;
int a = 0;
//selecting elements for window 3x3
for (int m = i -1; m < i + 2; m++)
{
for (int n = j - 1; n < j + 2; n++)
{
element3[a] = img.at<Vec3b>(m*img.cols + n);
a++;
for (int c = 0; c < img.channels(); c++)
{
element[k] += img.at<Vec3b>(m*img.cols + n)[c];
}
k++;
}
}
//comparing and sorting elements in window (uchar element [9])
for (int b = 0; b < end; b++)
{
int min = b;
for (int d = b + 1; d < 9; d++)
{
if (element[d] < element[min])
{
min = d;
const uchar temp = element[b];
element[b] = element[min];
element[min] = temp;
const Vec3b temporary = element3[b];
element3[b] = element3[min];
element3[min] = temporary;
}
}

}

// index in resultant image( after alpha-trimmed filter)
int result = (i - 1) * (img.cols - 2) + j - 1;
for (int l = start ; l < end; l++)
img9.at<Vec3b>(result) += element3[l];
img9.at<Vec3b>(result) /= (9 - alpha);
}
}
namedWindow("AlphaTrimmed Filter", WINDOW_AUTOSIZE);
imshow("AlphaTrimmed Filter", img9);
return 0;
}

最佳答案

没有实际数据,这有点像猜测,但是 uchar不能容纳 3 个 channel 的总和。它以 256 为模工作(至少在 OpenCV 支持的任何平台上)。

正确的解决方案是 std::sort为您的 Vec3b 配备合适的比较器:

void L1(Vec3b a, Vec3b b) { return a[0]+a[1]+a[2] < b[0]+b[1]+b[2]; }

关于c++ - Alpha 修整过滤器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40115564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com