【发布时间】:2016-12-23 23:27:47
【问题描述】:
我有实现 Prewitt 边缘检测的代码。我需要做的是只用一个缓冲区来实现它,也就是说,我不会创建图像的副本,而是编辑原始图像。因此,如果我想更改值为 78 的像素,我不能输入新值,例如100 直到所有周围像素的读取值都为 78。Color values of the pixels。我已经尝试了一整天但无法弄清楚,如果有人能给我写一些伪代码,我将非常感激
void filter_serial_prewitt(int *inBuffer, int *outBuffer, int width, int height){
for (int i = 1; i < width - 1; i ++) {
for (int j = 1; j < height - 1; j ++) {
int Fx = 0;
int Fy = 0;
int F = 0;
for (int m = -1; m <= 1; m++) {
for (int n = -1; n <= 1; n++) {
Fx += inBuffer[(j + n) * width + (i + m)] * n;
Fy += inBuffer[(j + n) * width + (i + m)] * m;
}
}
F = abs(Fx) + abs(Fy);
if (F < THRESHOLD){
outBuffer[j * width + i] = 255;
} else{
outBuffer[j * width + i] = 0;
}
}
}
}
【问题讨论】:
-
为什么只需要 1 个缓冲区?并非每种图像处理技术都可以就地完成,如果您可以将它们分成多个通道(尤其是某些类型的卷积),许多技术会更有效。一种替代方法是使用只有几行长的缓冲区,而不是整个第二张图像。这是一个可以接受的答案吗?
-
@user1118321 好吧,我知道使用两个缓冲区会更容易更好,但这就是我分配的重点。只编辑原始图像。好吧,我可能需要一些缓冲区来保留这些值,直到它们可以替换原始值,但正如我所说,我不知道该怎么做。如果这改变了任何事情,我必须以串行和并行的方式进行。
标签: c++ image edge-detection