国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

OPENCV去除小連通區(qū)域,去除孔洞

2019-11-06 06:25:22
字體:
供稿:網(wǎng)友

一、對于二值圖,0代表黑色,255代表白色。去除小連通區(qū)域與孔洞,小連通區(qū)域用8鄰域,孔洞用4鄰域。

 

  函數(shù)名字為:void RemoveSmallRegion(Mat &Src, Mat &Dst,int AreaLimit, int CheckMode, int NeihborMode)

     CheckMode: 0代表去除黑區(qū)域,1代表去除白區(qū)域; NeihborMode:0代表4鄰域,1代表8鄰域;  

如果去除小連通區(qū)域CheckMode=1,NeihborMode=1去除孔洞CheckMode=0,NeihborMode=0

     記錄每個(gè)像素點(diǎn)檢驗(yàn)狀態(tài)的標(biāo)簽,0代表未檢查,1代表正在檢查,2代表檢查不合格(需要反轉(zhuǎn)顏色),3代表檢查合格或不需檢查 。

1.先對整個(gè)圖像掃描,如果是去除小連通區(qū)域,則將黑色的背景圖作為合格,像素值標(biāo)記為3,如果是去除孔洞,則將白色的色素點(diǎn)作為合格,像素值標(biāo)記為3。

2.掃面整個(gè)圖像,對圖像進(jìn)行處理。

void RemoveSmallRegion(Mat &Src, Mat &Dst,int AreaLimit, int CheckMode, int NeihborMode){	int RemoveCount = 0;	//新建一幅標(biāo)簽圖像初始化為0像素點(diǎn),為了記錄每個(gè)像素點(diǎn)檢驗(yàn)狀態(tài)的標(biāo)簽,0代表未檢查,1代表正在檢查,2代表檢查不合格(需要反轉(zhuǎn)顏色),3代表檢查合格或不需檢查 	//初始化的圖像全部為0,未檢查	Mat PointLabel = Mat::zeros(Src.size(), CV_8UC1);	if (CheckMode == 1)//去除小連通區(qū)域的白色點(diǎn)	{		cout << "去除小連通域.";		for (int i = 0; i < Src.rows; i++)		{			for (int j = 0; j < Src.cols; j++)			{				if (Src.at<uchar>(i, j) < 10)				{					PointLabel.at<uchar>(i, j) = 3;//將背景黑色點(diǎn)標(biāo)記為合格,像素為3				}			}		}	}	else//去除孔洞,黑色點(diǎn)像素	{		cout << "去除孔洞";		for (int i = 0; i < Src.rows; i++)		{			for (int j = 0; j < Src.cols; j++)			{				if (Src.at<uchar>(i, j) > 10)				{					PointLabel.at<uchar>(i, j) = 3;//如果原圖是白色區(qū)域,標(biāo)記為合格,像素為3				}			}		}	}	vector<Point2i>NeihborPos;//將鄰域壓進(jìn)容器	NeihborPos.push_back(Point2i(-1, 0));	NeihborPos.push_back(Point2i(1, 0));	NeihborPos.push_back(Point2i(0, -1));	NeihborPos.push_back(Point2i(0, 1));	if (NeihborMode == 1)	{		cout << "Neighbor mode: 8鄰域." << endl;		NeihborPos.push_back(Point2i(-1, -1));		NeihborPos.push_back(Point2i(-1, 1));		NeihborPos.push_back(Point2i(1, -1));		NeihborPos.push_back(Point2i(1, 1));	}	else cout << "Neighbor mode: 4鄰域." << endl;	int NeihborCount = 4 + 4 * NeihborMode;	int CurrX = 0, CurrY = 0;	//開始檢測	for (int i = 0; i < Src.rows; i++)	{		for (int j = 0; j < Src.cols; j++)		{			if (PointLabel.at<uchar>(i, j) == 0)//標(biāo)簽圖像像素點(diǎn)為0,表示還未檢查的不合格點(diǎn)			{   //開始檢查				vector<Point2i>GrowBuffer;//記錄檢查像素點(diǎn)的個(gè)數(shù)				GrowBuffer.push_back(Point2i(j, i));				PointLabel.at<uchar>(i, j) = 1;//標(biāo)記為正在檢查				int CheckResult = 0;				for (int z = 0; z < GrowBuffer.size(); z++)				{					for (int q = 0; q < NeihborCount; q++)					{						CurrX = GrowBuffer.at(z).x + NeihborPos.at(q).x;						CurrY = GrowBuffer.at(z).y + NeihborPos.at(q).y;						if (CurrX >= 0 && CurrX<Src.cols&&CurrY >= 0 && CurrY<Src.rows)  //防止越界  						{							if (PointLabel.at<uchar>(CurrY, CurrX) == 0)							{								GrowBuffer.push_back(Point2i(CurrX, CurrY));  //鄰域點(diǎn)加入buffer  								PointLabel.at<uchar>(CurrY, CurrX) = 1;           //更新鄰域點(diǎn)的檢查標(biāo)簽,避免重復(fù)檢查  							}						}					}				}				if (GrowBuffer.size()>AreaLimit) //判斷結(jié)果(是否超出限定的大小),1為未超出,2為超出  					CheckResult = 2;				else				{					CheckResult = 1;					RemoveCount++;//記錄有多少區(qū)域被去除				}				for (int z = 0; z < GrowBuffer.size(); z++)				{					CurrX = GrowBuffer.at(z).x;					CurrY = GrowBuffer.at(z).y;					PointLabel.at<uchar>(CurrY,CurrX)+=CheckResult;//標(biāo)記不合格的像素點(diǎn),像素值為2				}				//********結(jié)束該點(diǎn)處的檢查**********  			}		}	}	CheckMode = 255 * (1 - CheckMode);	//開始反轉(zhuǎn)面積過小的區(qū)域  	for (int i = 0; i < Src.rows; ++i)	{		for (int j = 0; j < Src.cols; ++j)		{			if (PointLabel.at<uchar>(i,j)==2)			{				Dst.at<uchar>(i, j) = CheckMode;			}			else if (PointLabel.at<uchar>(i, j) == 3)			{				Dst.at<uchar>(i, j) = Src.at<uchar>(i, j);							}		}	}	cout << RemoveCount << " objects removed." << endl;}調(diào)用函數(shù):dst是原來的二值圖。

        Mat erzhi1 = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC1);RemoveSmallRegion(dst, erzhi,100, 1, 1);RemoveSmallRegion(erzhi, erzhi,100, 0, 0);imshow("erzhi1", erzhi);

和之前的圖像相比


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 利辛县| 读书| 宁国市| 息烽县| 女性| 齐齐哈尔市| 祥云县| 宁津县| 革吉县| 满洲里市| 西华县| 卢湾区| 清水县| 东城区| 康马县| 丰都县| 博白县| 龙山县| 东乌珠穆沁旗| 泰宁县| 呼图壁县| 克拉玛依市| 保山市| 红原县| 永善县| 会宁县| 马关县| 江源县| 罗田县| 陕西省| 金寨县| 沁水县| 唐山市| 油尖旺区| 景谷| 东港市| 定南县| 广平县| 樟树市| 济南市| 周口市|