区域生长(用鼠标选择一个点进行生长)


#include <opencv2/opencv.hpp>   
#include <iostream>
using namespace std;
using namespace  cv;
Mat src,dst;    
bool YN=0; //记录是否已经按下鼠标左键
//函数声明
void RegionGrow(Point point,Mat &src,Mat &dst);
void on_mouse( int event, int x, int y, int flags, void * ustc);

int main()    
{    
	src=imread("E:\\图片\\VC\\gray_cells.BMP",0);    
	namedWindow("src",1); 
	imshow( "src", src ); 
	setMouseCallback( "src", on_mouse, 0 );    
	waitKey(0);     
	return 0;    
}    

void RegionGrow(Point point,Mat &src,Mat &dst)
{

	dst=src.clone();
	uchar* p_data=dst.data;
	// 图像每行像素所占的字节数
	int nLineByte = dst.cols;
	// 图像的宽度
	int nWidth =dst.cols;
	// 图像的高度
	int nHeight =dst.rows;

	// 计算种子点的灰度值
	int nSeedPoint = *(p_data + (nHeight - point.y) * nLineByte + point.x);
	// 对各个像素进行灰度转换
	for (int j = 0; j < nHeight; j ++)
		for (int i = 0; i < nWidth; i ++)
		{
			//当前像素点的灰度值
			int nTemp = *(p_data + nLineByte * j + i);

			//如果当前点与种子点的灰度值之差的绝对值大于阈值10,则将该点置为255
			if ( abs(nTemp - nSeedPoint) > 10 )    
				*(p_data + nLineByte * j + i) = 255;
		}
}
void on_mouse( int event, int x, int y, int flags, void * ustc) 
{    
	Point pt;
	if (event == CV_EVENT_LBUTTONDOWN)
	{

		if( !YN )    
		{   
			pt.x=x;    
			pt.y=y;
			circle( src, pt, 2,cvScalar(255,0,0,0) ,CV_FILLED, CV_AA, 0 );    
			imshow( "src", src ); 
			cout<<pt<<endl;
			YN=1;
			RegionGrow(pt,src,dst);
			imshow("dst",dst);
		}  
	}
}   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值