opencv之图像搭桥法

来源:互联网 发布:小猪cms源码下载 编辑:程序博客网 时间:2024/04/30 12:37

这里演示的是水平和垂直搭桥:

大致原理为:

s(为白点的个数,并通过s是否为0来标记最初的白点io),当扫描到黑点时,在判断s是否在阈值类,如果在,则将这段白点用直线画黑线,反正不画。

代码如下:

// a4.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <OpenCV245.h>using namespace cv;using namespace std;void graftDot(Mat &image){int Hline = 4;int Lline = 10;/*int Hs = 0;int j0 = 0;*///竖着搭桥/*for (int i = 0; i < image.cols; i++){for (int j = 0; j < image.rows; j++){if ( image.at<uchar>(j, i) == 255 ){if ( Hs == 0){j0 = j;} Hs++;}else{if ( Hs < Hline  && Hs > 0){line(image, Point(i, j0), Point(i,j),0);  }Hs = 0;j0 =0;}}}*///横着搭桥int Ls = 0;int i0 = 0;for (int j = 0; j < image.rows;++j){uchar* p = image.ptr<uchar>(j);for (int i = 0; i < image.cols; ++i){if (image.at<uchar>(j, i) == 255){if ( Ls == 0 ){i0 = i;}Ls++;}else{if ( Ls < Lline && Ls > 0){line(image, Point(i0, j), Point(i, j), 0);}
                            Ls = 0;
                            i0 = 0;}}}//竖着搭桥int Hs = 0;int j0 = 0;for (int i = 0; i < image.cols; i++){for (int j = 0; j < image.rows; j++){if ( image.at<uchar>(j, i) == 255 ){if ( Hs == 0){j0 = j;} Hs++;}else{if ( Hs < Hline  && Hs > 0){line(image, Point(i, j0), Point(i,j),0);  }Hs = 0;j0 =0;}}}}int _tmain(int argc, _TCHAR* argv[]){Mat src = imread("C:\\Users\\sony\\Desktop\\显著2.png");Mat result;result = src.clone();cvtColor(src, src, CV_RGB2GRAY);Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1,-1));erode(src,src,kernel,Point(-1,-1),1);threshold(src, src, 160, 255, THRESH_BINARY);resize(src, src, Size(400, 400));graftDot(src);//resize(src,src,Size(600, 600));imshow("src",src);waitKey(0);return 0;}


原创粉丝点击