Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪种数据结构适合存储C++中的相邻像素距离?_C++_Opencv_Image Processing_Image Segmentation_Connected Components - Fatal编程技术网

哪种数据结构适合存储C++中的相邻像素距离?

哪种数据结构适合存储C++中的相邻像素距离?,c++,opencv,image-processing,image-segmentation,connected-components,C++,Opencv,Image Processing,Image Segmentation,Connected Components,我想为彩色图像实现组件标签算法 计算i,j处四个相邻像素与当前像素的颜色距离,算法进行如下操作: 如果没有一个相邻的颜色距离小于预定义的阈值T,则为像素i、j指定一个新标签 如果只有一个邻居的颜色距离小于T,则将其标签指定给像素i,j a如果两个或多个相邻像素的颜色距离小于T,则i,j处的像素被指定为具有最小颜色距离的像素的标签 b具有最小颜色距离的像素的标签也被分配给其他相邻像素 c图像中与其他相邻像素具有相同标签的所有先前标记的像素被重新分配具有最小颜色距离的像素的标签 我想用OpenCV库

我想为彩色图像实现组件标签算法

计算i,j处四个相邻像素与当前像素的颜色距离,算法进行如下操作:

如果没有一个相邻的颜色距离小于预定义的阈值T,则为像素i、j指定一个新标签

如果只有一个邻居的颜色距离小于T,则将其标签指定给像素i,j

a如果两个或多个相邻像素的颜色距离小于T,则i,j处的像素被指定为具有最小颜色距离的像素的标签

b具有最小颜色距离的像素的标签也被分配给其他相邻像素

c图像中与其他相邻像素具有相同标签的所有先前标记的像素被重新分配具有最小颜色距离的像素的标签

我想用OpenCV库实现C++中的代码。我可以使用什么样的数据结构来实现上述算法?我应该使用std::map来存储邻居距离值吗


此外,如果任何一个条件满足1-3,我需要将对应像素的标签指定给当前像素I,j。所以我还需要知道它是哪个邻居的标签,即左、上、左上对角线、右上对角线。我如何得到它呢?

哈希表可以很好地用于此用例:

unordered_map<srcpixel,vector<pair<targetpixel,dist> > >
因此,每个srcpixel将充当哈希表的键,值将是一个向量,包含它与相邻像素的距离


这将是快速的,每个srcpixel需要1次查找时间,然后对其邻域进行线性遍历。

要存储到每个像素的4个邻域的颜色距离,您应该使用基于数组的数据结构,即std::vector、普通C数组或甚至opencv图像,只要您使用起来最方便。 为了在一维数组中存储图像的像素的值,该数组通常按行索引,即索引j*imageWidth+i用于寻址像素i,j

例如,使用std::vector,您可以像下面这样存储到邻居的距离值:

std::vector<uint8_t> colorDistDown(imageWidth * (imageHeight-1));
for(int j = 0; j < imageHeight - 1; ++j) {
  for(int i = 0; i < imageWidth; ++i) {
    colorDistDown[j * imageWidth + i] = colorDistance(image, i,j, i,j+1);
  }
}

使用std::map或std::无序_映射会慢得多。但是,如果您只想存储图像中较小和非矩形区域的条目,则使用地图数据结构可能是有意义的。

您可以使用一组整数Mat1i来存储标签值。您不需要映射或哈希表我知道可以使用Mat来存储标签值。我的问题不是这样!我问我可以使用什么数据结构来存储相邻距离并进行比较。你也可以将距离值存储在垫子中。如果你有8个邻居,你可以做一个8通道的浮球垫。但是你的算法似乎是对图像进行一次扫描来设置标签,然后进行第二次扫描来解决标签的等价性,我根本不明白为什么需要存储距离。只需动态计算每个像素,并相应地设置标签。可能至少有一些伪代码比编号的列表信息更丰富。你是说srcpidel=当前像素i,j?如何与存储在此向量中的相邻距离进行比较?你能帮我吗?因为我对C++没有太多的了解。我需要计算光栅扫描中当前像素I,j的4个相邻点的距离。此外,如果任何一个条件满足1-3,我需要将对应像素的标签指定给当前像素I,j。所以我还需要知道它是哪个邻居的标签,即左、上、左上对角线、右上对角线。我怎么知道?