1.OpenCV API之distanceTransform 寻找质心

1.测试图片如下

2.测试结果如下

3.代码如下

#include <opencv2/core/utility.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <stdio.h>
using namespace std;
using namespace cv;

int main(int argc,char *argv[])
{
    float maxValue=0;  //定义距离变换矩阵中的最大值
    Point Pt(0,0);
    Mat image=imread("d:/6.png");
    Mat imageGray;
    cvtColor(image,imageGray,COLOR_RGB2GRAY);
    imageGray=~imageGray;  //取反
    GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波
    threshold(imageGray,imageGray,20,200,cv::THRESH_BINARY); //阈值化
    Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵
    distanceTransform(imageGray,imageThin, cv::DIST_L2,3);  //距离变换
    Mat distShow;
    distShow = Mat::zeros(imageGray.size(),CV_8UC1);
    imageThin.convertTo(distShow,CV_8UC1);
    //寻找质心(最大值)
    double minVal, maxVal;
    int    minIdx[2] = {}, maxIdx[2] = {};	// minnimum Index, maximum Index

    minMaxIdx(imageThin, &minVal, &maxVal, minIdx, maxIdx);

    normalize(distShow,distShow,0,255,NORM_MINMAX); //为了显示清晰,做了0~255归一化
    circle(image,Point(maxIdx[1],maxIdx[0]),maxVal,Scalar(0,0,255),3); //显示最大圆
    circle(image,Point(maxIdx[1],maxIdx[0]),3,Scalar(0,255,0),3); //显示质心
    imshow("Source Image",image);
    imshow("Thin Image CV_32FC1",imageThin);
    imshow("Thin Image2 CV_8UC1",distShow);
    waitKey();
    return 0;
}

4.关于distanceTransform 的说明

距离变换函数 cv2.distanceTransform()计算二值图像内任意点到最近背景点的距离。一般情况下,该函数计算的是图像内非零值像素点到最近的零值像素点的距离,即计算二值图像中所有像素点距离其最近的值为 0 的像素点的距离。当然,如果像素点本身的值为 0,则这个距离也为 0。
距离变换函数 cv2.distanceTransform()的计算结果反映了各个像素与背景(值为 0 的像素点)的距离关系。通常情况下:
如果前景对象的中心(质心)距离值为 0 的像素点距离较远,会得到一个较大的值。
如果前景对象的边缘距离值为 0 的像素点较近,会得到一个较小的值。
如果对上述计算结果进行阈值化,就可以得到图像内子图的中心、骨架等信息。距离变换函数 cv2.distanceTransform()可以用于计算对象的中心,还能细化轮廓、获取图像前景等,有多种功能。


推荐一个课程(【网易云课堂】)


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值