2014-04-19 15:49:09 tb3039450 阅读数 6288

一.确定不规则连通区域的质心

原样本


matlab处理

clear;clc;close all
I=imread('img.jpg'); 

I_gray=rgb2gray(I);
level=graythresh(I_gray);

[height,width]=size(I_gray);
I_bw=im2bw(I_gray,level);

for i=1:height %%循环中进行反色
for j=1:width
    if I_bw(i,j)==1
        I_bw(i,j)=0;
    else I_bw(i,j)=1;
    end
    
end
end

[L,num]=bwlabel(I_bw,8);
plot_x=zeros(1,num);%%用于记录质心位置的坐标
plot_y=zeros(1,num);

for k=1:num  %%num个区域依次统计质心位置
    sum_x=0;sum_y=0;area=0;
    for i=1:height
    for j=1:width
       if L(i,j)==k
        sum_x=sum_x+i;
        sum_y=sum_y+j;
        area=area+1;   
       end
    end
    end
    plot_x(k)=fix(sum_x/area);
    plot_y(k)=fix(sum_y/area);
end

figure(1);
imshow(I_bw);
for i=1:num
hold on
plot(plot_y(i) ,plot_x(i), '*');
end
处理后的样本



至此,使用matlab找出了不规则连通区域的质心点.

转载请注明出处.

2016-03-22 16:26:09 qq_23100787 阅读数 9572

这篇文章的起因是因为我在做一个项目,其中的要求就是求图像的质心,这个算法初步实现了一个功能:
给出一张图片如下:
这里写图片描述

然后把这个图片保存到d:\测试.jpg目录,最后运行我的函数即可

写的思路:
对于图片,质心肯定会数值不一样,这时候可以通过这种想法,然后设定阈值,对于图片数据进行二重循环,最终找到质心那块范围的坐标,最后就能够求出质心

下面附上源代码:(一个名为centroid的matlab函数)

function y = centroid()
I = imread('d:\\测试1.jpg');
[M,N,P] = size(I);
int8 sumx ;
int8 sumy ;
int8 count ;
 sumx = 0;
 sumy = 0;
 count = 0;
 int8 R ;
 int8 G ;
 int8 B ;
 R = 20; G = 200;B = 200;
for i = 1:1:M
    for j = 1:1:N
            if I(i,j,1)>=R &&  I(i,j,2)>=G && I(i,j,3)>=B
                 sumx = sumx + i;
                 sumy = sumy +j;
                 count = count + 1;
            end
    end
end
sumx = sumx / count;    %sumx存储了x轴坐标
sumy = sumy / count;    %sumy存储了y轴坐标
disp(sumx);disp(sumy);

运行效果图:
这里写图片描述

运行结果已经求出了质心

2015-06-16 14:44:13 Q1302182594 阅读数 7780

    在matlab中,可以通过直接编程的方法来计算图像目标区域的质心[6],也可以通过专用的质心函数( regionprops() )达到同样的目的[7]。

    然而,在VTK中并没有找到专门用于计算图像目标区域质心的类,唯有通过ITK来实现。下面是主要的实现代码。

QList <QPoint3D> calculateRegionCentroid(vtkImageData *data)
{
    QList < QPoint3D > centroids; // QPoint3D是仿照QPoint(不支持浮点数)而定义的一个类,支持浮点数

    if ( !data )
       return centroids;

    double spacing[3];
    data->GetSpacing( spacing );

    itk::VTKImageToImageFilter<UCharImageType>::Pointer	vtk2itkConnector // 将VTK图像转换为ITK图像
            = itk::VTKImageToImageFilter< UCharImageType>::New();

    BinaryImageToLabelMapFilterType::Pointer binaryImageToLabelMapFilter
            = BinaryImageToLabelMapFilterType::New();

    LabelMapToLabelImageFilterType::Pointer  labelMapToLabelImageFilter
            = LabelMapToLabelImageFilterType::New();

    LabelGeometryImageFilterType::Pointer labelGeometryImageFilter
            = LabelGeometryImageFilterType::New();

    vtk2itkConnector->SetInput( data );

    binaryImageToLabelMapFilter->SetInput( vtk2itkConnector->GetOutput() );

    labelMapToLabelImageFilter->SetInput( binaryImageToLabelMapFilter->GetOutput());

    labelGeometryImageFilter->SetInput( labelMapToLabelImageFilter->GetOutput() );

    // These generate optional outputs.
    labelGeometryImageFilter->CalculatePixelIndicesOn();
    labelGeometryImageFilter->CalculateOrientedBoundingBoxOn();
    labelGeometryImageFilter->CalculateOrientedLabelRegionsOn();
    labelGeometryImageFilter->Update();

    LabelGeometryImageFilterType::LabelsType allLabels = labelGeometryImageFilter->GetLabels();
    LabelGeometryImageFilterType::LabelsType::iterator allLabelsIt;

    for( allLabelsIt = allLabels.begin(); allLabelsIt != allLabels.end(); allLabelsIt++ ) {
        LabelGeometryImageFilterType::LabelPixelType labelValue = *allLabelsIt;
        if ( (int)labelValue > 0 ) {
            double x = labelGeometryImageFilter->GetCentroid( labelValue )[0];
            double y = labelGeometryImageFilter->GetCentroid( labelValue )[1];
            centroids.append( QPoint3D( x * spacing[0], y * spacing[1], 0 ) );
        }
    }

    binaryImageToLabelMapFilter->SetInput( NULL );
    labelMapToLabelImageFilter->SetInput( NULL );
    labelGeometryImageFilter->SetInput( NULL );
    vtk2itkConnector->SetInput( NULL );

    return centroids;
}

参考资料

[1]图像处理之计算二值连通区域的质心

[2]图形图像基本处理之——一个非常容易理解的图像求质心代码

[3]Image processing -Algorithm to calculate centroids of white space in binary image

[4]how to find the centroid of a binary image?

[5]图像目标质心快速搜索算法

[6]MATLAB中求图像中某一区域的质心  

[7]regionprops函数中centroid求质心,其质心评定原理?

2019-04-19 15:34:28 qq_44919293 阅读数 2205
                     

这篇文章的起因是因为我在做一个项目,其中的要求就是求图像的质心,这个算法初步实现了一个功能:
给出一张图片如下:
这里写图片描述

然后把这个图片保存到d:\测试.jpg目录,最后运行我的函数即可

写的思路:
对于图片,质心肯定会数值不一样,这时候可以通过这种想法,然后设定阈值,对于图片数据进行二重循环,最终找到质心那块范围的坐标,最后就能够求出质心

下面附上源代码:(一个名为centroid的matlab函数)

function y = centroid()I = imread('d:\\测试1.jpg');[M,N,P] = size(I);int8 sumx ;int8 sumy ;int8 count ; sumx = 0; sumy = 0; count = 0; int8 R ; int8 G ; int8 B ; R = 20; G = 200;B = 200;for i = 1:1:M    for j = 1:1:N            if I(i,j,1)>=R &&  I(i,j,2)>=G && I(i,j,3)>=B                 sumx = sumx + i;                 sumy = sumy +j;                 count = count + 1;            end    endendsumx = sumx / count;    %sumx存储了x轴坐标sumy = sumy / count;    %sumy存储了y轴坐标disp(sumx);disp(sumy);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

运行效果图:
这里写图片描述

运行结果已经求出了质心

           
2012-12-16 13:06:34 zhufanqie 阅读数 20864

     
        下面贴出我的一个很简单且很容易理解的质心标志代码出来,供大家参考,代码都写了注释的,详情如下:   

clear;clc;close all;
I=imread('E:\xxx.jpg');%读取原图像
figure(1);imshow(I);%显示原图像

I_gray=rgb2gray(I);%原图像变为灰度图像
level=graythresh(I_gray);%计算图像I_gray的全局阈值,level为标准化灰度值,其范围为[0 1]
[height,width]=size(I_gray);%计算灰度图像的长宽
I_bw=im2bw(I_gray,level);%im2bw使用阈值level将灰度图像转换为二值图像.
figure(2);imshow(I_bw);%显示二值图像(背景为白色)

for i=1:height %%循环中进行反色
    for j=1:width   
        if I_bw(i,j)==1      
            I_bw(i,j)=0;  
        else I_bw(i,j)=1; 
        end
    end
end
figure(3);imshow(I_bw);%显示取反后的二值图像(背景为黑色)

[L,num]=bwlabel(I_bw,8);%bwlabel标注二值图像I_bw中的目标物体,返回标识矩阵L和I_bw中目标物体的数量num,8表示连通数.
plot_x=zeros(1,num);%%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的横坐标
plot_y=zeros(1,num);%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的纵坐标

for k=1:num  %%num个区域依次统计质心位置    
    sum_x=0;    sum_y=0;    area=0; %初始化
    for i=1:height   
        for j=1:width 
            if L(i,j)==k     
                sum_x=sum_x+i;  %计算第K区域的横坐标总和
                sum_y=sum_y+j;  %计算第K区域的纵坐标总和 
                area=area+1;    %计算第K区域的由多少个坐标点表示
            end
        end
    end
    plot_x(k)=fix(sum_x/area);  %计算第K区域的质心横坐标
    plot_y(k)=fix(sum_y/area);%计算第K区域的质心纵坐标
end

figure(4);imshow(I_bw);%显示取反后的二值图像(背景为黑色),并在图上标注质心点位置
for i=1:num
    hold  on
    plot(plot_y(i) ,plot_x(i), '*')
end

运行出来的图例为:

 

 

        从上面的图片看来,此方法对子区域较明显的图片有较强的分辨率,但是针对图片的子区域不那么的显著地情况呢,下面我们用另一幅图片进行测试,运行结果如下:

 

 

 

      所以对图片特定区域求质心还有待进一步研究。


 

没有更多推荐了,返回首页