Image processing 图像中弯管长度测量的特征检测技术
我从荧光显微镜实验中得到了数百张DNA纳米管的图像,我想用图像处理的自动化方法来测量管长度的分布。以下是显微镜图像示例: 我尝试了一些使用python和skimage的特征提取方法。我曾尝试使用Canny边缘检测,它成功地创建了每个纳米管的轮廓,但我不清楚如何从这些轮廓到长度的确定度量。在应用Canny边缘检测后,我尝试使用概率Hough变换将直线拟合到曲线,这将使长度测量变得简单。正如您在这些结果中所看到的: 直线拟合不一致,并且为同一管结构并行创建了多条直线Image processing 图像中弯管长度测量的特征检测技术,image-processing,Image Processing,我从荧光显微镜实验中得到了数百张DNA纳米管的图像,我想用图像处理的自动化方法来测量管长度的分布。以下是显微镜图像示例: 我尝试了一些使用python和skimage的特征提取方法。我曾尝试使用Canny边缘检测,它成功地创建了每个纳米管的轮廓,但我不清楚如何从这些轮廓到长度的确定度量。在应用Canny边缘检测后,我尝试使用概率Hough变换将直线拟合到曲线,这将使长度测量变得简单。正如您在这些结果中所看到的: 直线拟合不一致,并且为同一管结构并行创建了多条直线 有人知道一种简单的方法来测量
有人知道一种简单的方法来测量这些管子的长度吗 我会这样开始:
union color
{
DWORD dd; WORD dw[2]; byte db[4];
int i; short int ii[2];
color(){}; color(color& a){ *this=a; }; ~color(){}; color* operator = (const color *a) { dd=a->dd; return this; }; /*color* operator = (const color &a) { ...copy... return this; };*/
};
cnt
中的重新着色像素进行计数
如果面积大小cnt
太小,则将其重新填充到背景中,否则将其大小cnt/平均管宽度
计入直方图中图片pic0,pic1;
//pic0源img
//pic1-输出img
//0xAARGGBB
常量DWORD col_backg=0x002020;//灰色
常数DWORD col_管=0x00FFFFFF;//白色
常量DWORD col_done=0x0000A0FF;//水
常量DWORD col_noise=0x00000080;//蓝色
常量DWORD列错误=0x00FF0000;//红色(太小的历史值)
常量DWORD col_hist=0x00FFFF00;//黄色的
常量DWORD col_测试=0x01000000;//A*填充开始颜色(必须大于使用的所有其他颜色)
int x,y,xx,yy,i;
德沃德c;
常数int _hist=256;//直方图的最大区域大小
int hist[_hist];//直方图
//将源图像复制到输出
pic1=pic0;
pic1.增强_范围();//最大化动态范围^3
pic1.pixel_格式(_pf_);//转换为灰度
pic1.阈值(100766,柱背,柱管);//二值化图像的阈值强度
pic1.pf=\u pf\u rgba;//设置为RGBA(无转换)
//清晰直方图
for(i=0;idat[i];i++;
如果(x>=0)和(y>=0)和(y>=0)0)和(x)和(x)和(x)x(x)如果(x)如果(x)如果(x>>=0)如果(x)如果(x>=0)和(x)如果(x>=0)和(x)x)和(x)p[y)p[y][x.dd=D=id;D=id;D=id;D;D=id;D;D;D=D;如果(美国洪水填充;如果(洪水填充;如果(如(洪水)是)是)的;如果(洪水填充;如果(洪水,如果(洪水填充,如果(洪水(洪水)是)或者(洪水填充)是)或者(x x x)的,如果(洪水填)的)洪水,如果(x x x x)洪水,洪水,洪水填充)或者或者(x x)的)洪水,洪水,洪水填充(x x)的)洪水,洪水,洪水,洪水填充(x)的&&(xadd(y);p[y][x].dd=id;_洪水填充_n++;如果例如,如果(洪水填充物)的洪水填充物(y)y0=y;如果(洪水填充物(y)y0=y;如果(洪水填充物(U)y0=y;如果(洪水填充物(U)x1=0)和(x)dd(y);p[y[y[y[y[x]x]x x x x x)x)x)x;x;x;x;x;x;x;如果(洪水填充物(U(U(U)1=0=0=0)和(x)和(x)和(x)和(x)和(x)和(x)x)x(x)x(x(x)x;p(x;p(x;p[y;p[y[y[y[y[y[y[y[y[y[y[x)x)x)x)x)x)x)x)x)x)x)x)x)x.方方方方方方(x)x)x)x)x=x;如果(_泛洪填充_y0>y)(y)p[y][x][x.dd(y)p[y[y][x].dd=d.dd=id;dd=id;dd=id;did=id;did=id;如果(U洪水填充(U洪水填充(U.洪水填充(U x0>x)若若(U洪水填充(U.U洪水填充(U.U.U.0 0)0=0=0=0;如果(U洪水填充(U.0 0.0)0=0=0;如果(U洪水填充(U.0.0>0.y)洪水填充(y)洪水填充(y)你们们)洪水填充(y)洪水填充)洪水填充(U洪水填充(U 0.y)你们们)你们们)洪水填充(U洪水填充)你们们)的洪水填充(U洪水填充(0.0.y)你们们)你们们)的洪水填充(0.y0.y0.y0.y0.y0=0.y0)洪水填充ux1=0)和&(xadd(y);p[y][x].dd=id;_floodfill_n++;if(_floodfill_x0>x)_floodfill_x0=x;if(_floodfill_y0>y)_floodfill_y0=y;if(_floodfill_x1这远远超出了我的驾驶室,但你似乎想找到Canny边缘检测创建的形状的中心线。这里有一个与OpenCV相关的问题;也许那里的链接会给你一些想法?我尝试了Canny边缘检测,然后通过形态学闭合来填充间隙,然后是skeletonisation需要找到每个形状的中心线。我将我在原始形状上找到的东西用红色覆盖。看看你对结果的看法……谢谢你们!Skeletonize看起来确实是个不错的选择。@MarkSetchell这看起来正是我想要的!有些管子有小的分支从主线分叉,但这些应该很容易gh仅通过基于线长度的过滤来删除。是否有一种简单的方法来访问每条线的起点和终点以及总长度?为什么不使用形态学操作符对间隙进行二值化+填充,然后使用泛光填充计算每个对象的像素数并除以平均管厚度?也可以找到厚度如果使用*类泛光填充,则可以找到两个最远的点,使厚度与之垂直…因此只需计算该方向的像素数…如果从端点到端点进行投射,则*填充将直接获得长度。此外,A*将检测是否有相交的管(超过2个局部最大值)@Spektre好主意!这是利用了我知道管子的宽度应该一致这一事实。正如你所提到的,相交的管子会对此产生问题。你说“如果你对管子感兴趣,a*也会检测到”是什么意思?如果有一种方法可以检测交叉管,或者丢弃这两种管,那么找出一种方法来测量理想的单个长度。
union color
{
DWORD dd; WORD dw[2]; byte db[4];
int i; short int ii[2];
color(){}; color(color& a){ *this=a; }; ~color(){}; color* operator = (const color *a) { dd=a->dd; return this; }; /*color* operator = (const color &a) { ...copy... return this; };*/
};
enum{
_x=0, // dw
_y=1,
_b=0, // db
_g=1,
_r=2,
_a=3,
_v=0, // db
_s=1,
_h=2,
};