Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Image processing 图像中弯管长度测量的特征检测技术_Image Processing - Fatal编程技术网

Image processing 图像中弯管长度测量的特征检测技术

Image processing 图像中弯管长度测量的特征检测技术,image-processing,Image Processing,我从荧光显微镜实验中得到了数百张DNA纳米管的图像,我想用图像处理的自动化方法来测量管长度的分布。以下是显微镜图像示例: 我尝试了一些使用python和skimage的特征提取方法。我曾尝试使用Canny边缘检测,它成功地创建了每个纳米管的轮廓,但我不清楚如何从这些轮廓到长度的确定度量。在应用Canny边缘检测后,我尝试使用概率Hough变换将直线拟合到曲线,这将使长度测量变得简单。正如您在这些结果中所看到的: 直线拟合不一致,并且为同一管结构并行创建了多条直线 有人知道一种简单的方法来测量

我从荧光显微镜实验中得到了数百张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; };*/
    };
  • 对图像进行二值化
  • 查找管的每一组像素
  • 按管颜色填充该位置

    使用任何具有8个邻域的填充算法,并且在填充过程中还对某些计数器
    cnt
    中的重新着色像素进行计数

    如果面积大小
    cnt
    太小,则将其重新填充到背景中,否则将其大小
    cnt/平均管宽度
    计入直方图中

  • 下面是一个简单的C++示例:

    图片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,
        };