Image processing 基于游程编码的像素链

Image processing 基于游程编码的像素链,image-processing,blob,pixel,chain,run-length-encoding,Image Processing,Blob,Pixel,Chain,Run Length Encoding,这件事我已经绞尽脑汁很久了 我在做成像。到目前为止,我已经对图像进行了二值化,这意味着从灰度图像中,每个低于某个值的像素都会被删除。这只给了我原始图像的一些区域,这些区域周围有很多“零像素” 接下来,我将我的区域编码为“blob”。运行是一种数据压缩方法。例如,假设您对一个正方形进行了二值化,则只需运行几次即可描述整个图像。 梯段由x、y坐标和长度定义 重新创建图像时,对于每个梯段,转到x、y坐标,并在x轴上为梯段长度添加像素 现在,我必须采取运行,并创建一个链,它将描述该地区的轮廓。 我不知道

这件事我已经绞尽脑汁很久了

我在做成像。到目前为止,我已经对图像进行了二值化,这意味着从灰度图像中,每个低于某个值的像素都会被删除。这只给了我原始图像的一些区域,这些区域周围有很多“零像素”

接下来,我将我的区域编码为“blob”。运行是一种数据压缩方法。例如,假设您对一个正方形进行了二值化,则只需运行几次即可描述整个图像。 梯段由x、y坐标和长度定义

重新创建图像时,对于每个梯段,转到x、y坐标,并在x轴上为梯段长度添加像素

现在,我必须采取运行,并创建一个链,它将描述该地区的轮廓。 我不知道怎么做

我有一堆x,y,长度的跑步,我必须围绕边缘“导航”以形成一个。通常在成像过程中,这个过程是用原始图像完成的,但是我不能再使用原始图像了,所以我必须用运行来计算它

我知道这看起来像一堵巨大的文字墙,但我不知道如何更好地问这个问题

关于相同实现的任何提示或指针都将非常棒

编辑

由于“展开”,我将链接一些图像:


(来源:)


在本例中,他们将图像B处理为轮廓C(我称之为链)。然而,我想从d生成轮廓,运行长度,乍一看,我没有看到一个实用的算法。 穷人的解决办法是将原始图像从长度编码的图像展开。 所以,如果你的台词是这样的:

A 3B 10A C 8D
C 4D 3A 6C 9A
ABBBAAAAAAAAAACDDDDDDDD
CDDDDAAACCCCCCAAAAAAAAA
其中字符返回实际像素值(例如A=0,B=127,…)。 您可以将像素值写入一个二维数组(或您选择的另一个数据结构)

A 3B 10A C 8D
C 4D 3A 6C 9A
ABBBAAAAAAAAAACDDDDDDDD
CDDDDAAACCCCCCAAAAAAAAA
之后生成链,删除数组并保留链信息。
当然这是很昂贵的,所以也许你可以在对原始图片进行长度编码之前这样做。

这里有一个非常简单实用的解决方案(C++):

#包括
#包括
结构运行{intx,w;};
enum{东、东北、北、西北、西、西南、南、东南};
int main(){
常量运行数据[]={
{ 7, 2 },
{ 5, 6 },
{ 5, 7 },
{ 5, 7 },
{ 6, 6 },
{ 0, 12 },
{ 0, 12 },
{ 0, 11 },
{ 1, 7 },
{ 3, 4 },
{ 3, 4 },
{ 3, 5 },
{ 3, 7 },
{ 3, 7 },
{ 5, 5 }
};
标准::矢量运行(数据,数据+15);
std::之前的向量;
std::后向量;
无符号整数i;
int j;
对于(i=0;i运行[i+1].x){
前。推回(东北);
对于(j=0;j第二个右键){
对于(j=0;j案例东方:std::cout我失去了那份合同,但答案是使用


与我之前所想的不同,它是运行长度编码与算法无关。

这是一个典型的例子,其中一张图片的字数超过1K。您的描述很好,但如果您提供两张图片,它的可访问性至少会增加一倍。尤其是“链”这个概念很难理解,快速的谷歌搜索并没有发现任何明显的东西。(更新):我自由地将“链”一词链接到我认为合适的页面上。当然,请随意编辑,或者(更好!)在问题中插入图像。非常感谢。在这个例子中,他们是从原始图像生成链的(B) ,我想从运行中生成它(d).但这正是我所说的我不知道你的跑步结构包含什么,是x坐标和长度吗?我不知道如何将其与y坐标联系起来,所以我不确定这是否可行,因为如果你得到一个U形,你将不得不以某种方式回到你的数据数组中是的,它是x坐标和长度。y坐标没有只要扫描线是连续的,sn就无关紧要;假设运行[0]保留y值最低的梯段,以此类推。不,如果有多个梯段具有相同的y值,则不起作用;您可以通过将形状拆分为两组梯段,找到链,然后将它们连接起来来轻松解决此问题。我不认为分割图像是一项简单的任务,因为图像可能具有任意复杂性。例如:用蜡笔打开画图:在不松开鼠标按钮的情况下画出许多圆圈。分割它们很容易:只需找到垂直连续的组。要确定是否要连接任意两条链,请检查它们的运行是否垂直连续,并在适当的情况下将一条链拼接到另一条链上,覆盖尽可能多的east或west链接为