Image 计算图像中每行的像素数

Image 计算图像中每行的像素数,image,matlab,image-processing,line,Image,Matlab,Image Processing,Line,对于一个项目,我需要找到图像中线条之间的点距离。我想到的方法是将图像转换为二值图像,并计算每行中黑色背景下的白色像素数。我已经附上了我的代码,它工作得很好,只要线是完美的直线 顺便说一下,这是一张将要分析的样本图像。我计划转换为二进制/运行一个测线算法,以查找导线中两个绿色条带的边界,因为它们之间的距离值得关注 此代码返回直方图,峰值之间的距离表示线之间的间距 为了纠正折线的问题,我考虑使用一种方法,分析图像的列(比如100像素),然后循环,直到它在整个图像中循环(0-100列,然后101-

对于一个项目,我需要找到图像中线条之间的点距离。我想到的方法是将图像转换为二值图像,并计算每行中黑色背景下的白色像素数。我已经附上了我的代码,它工作得很好,只要线是完美的直线

顺便说一下,这是一张将要分析的样本图像。我计划转换为二进制/运行一个测线算法,以查找导线中两个绿色条带的边界,因为它们之间的距离值得关注

此代码返回直方图,峰值之间的距离表示线之间的间距

为了纠正折线的问题,我考虑使用一种方法,分析图像的列(比如100像素),然后循环,直到它在整个图像中循环(0-100列,然后101-200,直到图像的宽度)

我这里有我的伪代码:

for (loop through rows) 
    for (loop for coloumns) 
        count pixels at p(row, col) 
    end loop for columns 
    column counter = column counter - 1
    if column counter <= 0 then save the number of pixels counter and set column counter = 10
end row loop 
for(循环行)
for(冒号循环)
在p(行、列)处计数像素
列的结束循环
列计数器=列计数器-1

如果列计数器我一生中从未运行过Matlab,那么我无法告诉您Matlab中的确切代码行。。。不过,我可以告诉你如何删除非水平线的一般条款

您只需使用水平定向的适当内核卷积图像,因此根据您的需要,内核将是:

0       0       0
0.33    0.33    0.33
0       0       0
因此,输出图像中的每个像素基本上都是自身及其左右邻域的平均值

开始图像

ImageMagick命令:

convert lines.png -convolve "0,0,0,0.33,0.33,0.33,0,0,0" -threshold 99.99% horiz.jpg
结束图像

顺便说一句,您的行实际上有5个像素厚,因此您可能需要运行更大的内核来删除它们,例如9x9,其中所有系数都为零,除了中间(第5)行,它们都为1/9(即0.111)

我使用ImageMagick通过以下命令将图像调整为单像素宽的垂直列:

convert lines.png -resize 1x844! -threshold 50% txt:
这将给出以下输出,显示白线与顶部偏移149218476行

...
0,144: (0,0,0)  #000000  black
0,145: (0,0,0)  #000000  black
0,146: (0,0,0)  #000000  black
0,147: (255,255,255)  #FFFFFF  white
0,148: (255,255,255)  #FFFFFF  white
0,149: (255,255,255)  #FFFFFF  white    <- Centre of your line
0,150: (255,255,255)  #FFFFFF  white
0,151: (255,255,255)  #FFFFFF  white
0,152: (0,0,0)  #000000  black
0,153: (0,0,0)  #000000  black
0,154: (0,0,0)  #000000  black
...
0,213: (0,0,0)  #000000  black
0,214: (0,0,0)  #000000  black
0,215: (0,0,0)  #000000  black
0,216: (255,255,255)  #FFFFFF  white
0,217: (255,255,255)  #FFFFFF  white
0,218: (255,255,255)  #FFFFFF  white    <- Centre of your line
0,219: (255,255,255)  #FFFFFF  white
0,220: (255,255,255)  #FFFFFF  white
0,221: (0,0,0)  #000000  black
0,222: (0,0,0)  #000000  black
0,223: (0,0,0)  #000000  black
...
0,471: (0,0,0)  #000000  black
0,472: (0,0,0)  #000000  black
0,473: (0,0,0)  #000000  black
0,474: (255,255,255)  #FFFFFF  white
0,475: (255,255,255)  #FFFFFF  white
0,476: (255,255,255)  #FFFFFF  white    <- Centre of your line
0,477: (255,255,255)  #FFFFFF  white
0,478: (255,255,255)  #FFFFFF  white
0,479: (0,0,0)  #000000  black
0,480: (0,0,0)  #000000  black
0,481: (0,0,0)  #000000  black
...
。。。
0144:(0,0,0)#000000黑色
0145:(0,0,0)#000000黑色
0146:(0,0,0)#000000黑色
0147:(255255255)#FFFFFF白色
0148:(255255255)#FFFFFF白色

0149:(255255255)#ffffffff white卷积直方图:

h_accu = conv(histogram,(1:10)/10);
figure;plot(h_accu)
此处
10
用作窗口大小,应根据直线度进行调整


顺便说一句,找到线条的更一般的方法是。

Hm:)我知道我从某处认出了那个图像和那个图像!现在我来看看你的逻辑,如果我认为这行得通,我会提出一些建议。+1表示可运行代码!
Stackoverflow
@rayryeng上的珍品谢谢!你真是太棒了,我真的很感谢你的帮助,不幸的是,编码不是我的强项之一,我想做什么很容易说出来,但编写代码和语法对我来说是一个完全不同的游戏:/请原谅我的无知,但什么是
点距离
?是垂直距离吗?给定图像的“答案”是什么?@MarkSetchell是的,对于第一幅图像,它将是导线之间的垂直距离(即,分隔白色像素的列中黑色像素的数量)。在图片的伪直线段中,它将是相同的(一列中黑色像素的数量)嗨,谢谢你的回答,你能详细说明hough变换如何应用于这个问题吗?我读过一些关于它的文献,它似乎可以直观地检测到线条,但实际上并没有给出距离的定量反馈(除非我遗漏了什么)。hough变换的输出将是成对的“θ”和“d”,它们各自代表一条检测到的线条。θ是直线的方向,d是到图像原点的距离。这些值可以用于您的计算。非常有趣的选择!我以前没有使用过ImageMagick,可以看到这个解决方案是如何工作的,但我想把它放到一个循环中,在这个循环中我可以分析稍微弯曲的线条(这是我的主要问题)。我用待分析图像的图片更新了问题。
h_accu = conv(histogram,(1:10)/10);
figure;plot(h_accu)