Opencv距离变换distanceTransform应用——细化字符轮廓&&查找物体质心
2017-07-05 17:10
337 查看
OpenCV中distanceTransform方法用于计算图像中每一个非零点距离离自己最近的零点的距离,distanceTransform的第二个Mat矩阵参数dst保存了每一个点与最近的零点的距离信息,图像上越亮的点,代表了离零点的距离越远。
可以根据距离变换的这个性质,经过简单的运算,用于细化字符的轮廓和查找物体质心(中心)。
一、细化轮廓
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/894326369549b6311fce1e4215926914)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/80b98853485056250a7aef3645a1bb6f)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/d649f78f563edccdea196437ddcdc1d9)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/a5213635f181fece56f70a273335606b)
二、查找物体质心
#include "core/core.hpp"
#include "imgproc/imgproc.hpp"
#include "highgui/highgui.hpp"
using namespace cv;
int main(int argc,char *argv[])
{
float maxValue=0; //定义距离变换矩阵中的最大值
Point Pt(0,0);
Mat image=imread(argv[1]);
Mat imageGray;
cvtColor(image,imageGray,CV_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); //定义细化后的字符轮廓
for(int i=0;i<imageThin.rows;i++)
{
for(int j=0;j<imageThin.cols;j++)
{
distShow.at<uchar>(i,j)=imageThin.at<float>(i,j);
if(imageThin.at<float>(i,j)>maxValue)
{
maxValue=imageThin.at<float>(i,j); //获取距离变换的极大值
Pt=Point(j,i); //坐标
}
}
}
normalize(distShow,distShow,0,255,CV_MINMAX); //为了显示清晰,做了0~255归一化
circle(image,Pt,maxValue,Scalar(0,0,255),3);
circle(image,Pt,3,Scalar(0,255,0),3);
imshow("Source Image",image);
imshow("Thin Image",distShow);
waitKey();
return 0;
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/8b9793045eed2ab4c15a9bc9541dbf30)
可以根据距离变换的这个性质,经过简单的运算,用于细化字符的轮廓和查找物体质心(中心)。
一、细化轮廓
#include "core/core.hpp" #include "imgproc/imgproc.hpp" #include "highgui/highgui.hpp" using namespace cv; int main(int argc,char *argv[]) { float maxValue=0; //定义距离变换矩阵中的最大值 Mat image=imread(argv[1]); Mat imageGray; cvtColor(image,imageGray,CV_RGB2GRAY); imageGray=~imageGray; //取反 GaussianBlur(imageGray,imageGray,Size(5,5),2); //滤波 threshold(imageGray,imageGray,20,200,CV_THRESH_BINARY); //阈值 imshow("s",imageGray); Mat imageThin(imageGray.size(),CV_32FC1); //定义保存距离变换结果的Mat矩阵 distanceTransform(imageGray,imageThin,CV_DIST_L2,3); //距离变换 Mat distShow; distShow=Mat::zeros(imageGray.size(),CV_8UC1); //定义细化后的字符轮廓 for(int i=0;i<imageThin.rows;i++) { for(int j=0;j<imageThin.cols;j++) { if(imageThin.at<float>(i,j)>maxValue) { maxValue=imageThin.at<float>(i,j); //获取距离变换的极大值 } } } for(int i=0;i<imageThin.rows;i++) { for(int j=0;j<imageThin.cols;j++) { if(imageThin.at<float>(i,j)>maxValue/1.9) { distShow.at<uchar>(i,j)=255; //符合距离大于最大值一定比例条件的点设为255 } } } imshow("Source Image",image); imshow("Thin Image",distShow); waitKey(); return 0; }
二、查找物体质心
#include "core/core.hpp"
#include "imgproc/imgproc.hpp"
#include "highgui/highgui.hpp"
using namespace cv;
int main(int argc,char *argv[])
{
float maxValue=0; //定义距离变换矩阵中的最大值
Point Pt(0,0);
Mat image=imread(argv[1]);
Mat imageGray;
cvtColor(image,imageGray,CV_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); //定义细化后的字符轮廓
for(int i=0;i<imageThin.rows;i++)
{
for(int j=0;j<imageThin.cols;j++)
{
distShow.at<uchar>(i,j)=imageThin.at<float>(i,j);
if(imageThin.at<float>(i,j)>maxValue)
{
maxValue=imageThin.at<float>(i,j); //获取距离变换的极大值
Pt=Point(j,i); //坐标
}
}
}
normalize(distShow,distShow,0,255,CV_MINMAX); //为了显示清晰,做了0~255归一化
circle(image,Pt,maxValue,Scalar(0,0,255),3);
circle(image,Pt,3,Scalar(0,255,0),3);
imshow("Source Image",image);
imshow("Thin Image",distShow);
waitKey();
return 0;
}
相关文章推荐
- Opencv距离变换distanceTransform应用——细化字符轮廓&&查找物体质心
- Opencv距离变换distanceTransform应用——细化字符轮廓&&查找物体质心
- Opencv距离变换distanceTransform应用——细化字符轮廓&&查找物体质心
- OpenCV在明暗不同或光线不均的图片上查找轮廓-应用在Android NDK
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- python-opencv2利用cv2.findContours()函数来查找检测物体的轮廓
- OpenCV2应用Meanshift查找相似物体
- 距离变换distanceTransform应用——细化字符轮廓
- 采用opencv轮廓查找分割字符
- 【OpenCV学习笔记】三十一、轮廓特征属性及应用(八)——颜色物体识别与跟踪
- OpenCV 基于距离变换的高精度轮廓匹配
- 【opencv学习之三十六】轮廓特征应用:计算点与轮廓距离
- opencv之查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- 距离变换distanceTransform应用——寻找图像的质心
- opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子
- OpenCv轮廓高级应用(轮廓匹配,几何直方图)