小趙學習Opencv(2)之椒鹽噪聲及圖像銳化

今天主要學習《OpenCV2計算機視覺編程手冊》第二章,相應的功能實現如下:

【添加椒鹽噪聲】

void salt(Mat &image,int n)
{
	for(int k=0;k<n;k++)
	{
		int i=rand()%image.cols;
		int j=rand()%image.rows;
		if(image.channels()==1)
		{
			image.at<uchar>(j,i)=255;
		}
		else if(image.channels()==3)
		{
			image.at<Vec3b>(j,i)[0]=255;
			image.at<Vec3b>(j,i)[1]=255;
			image.at<Vec3b>(j,i)[2]=255;
		}
	}
}

【顏色縮減】

//顏色縮減

void colorReduce(Mat &image,int div)
{
	int nl=image.rows;
	int nc=image.cols*image.channels();
	for(int j=0;j<nl;j++)
	{
		uchar *data=image.ptr<uchar>(j);
		for(int i=0;i<nc;i++)
		{
			data[i]=data[i]/div*div+div/2;
		}
	}
}
【圖像銳化】

void sharpen2D(Mat &image,Mat &result)
{
	//構造核
	Mat kernel(3,3,CV_32F,Scalar(0));
	//對核元素進行賦值
	kernel.at<float>(1,1)=5.0;
	kernel.at<float>(0,1)=-1.0;
	kernel.at<float>(2,1)=-1.0;
	kernel.at<float>(1,0)=-1.0;
	kernel.at<float>(1,2)=-1.0;
	filter2D(image,result,image.depth(),kernel);
}

測試代碼如下:

void test2()
{
	Mat image=imread("lena.bmp");
	if(image.empty())
	{
		cout<<"can't load lena.bmp!"<<endl;
		return;
	}
	cout << image.type() << endl;
	Mat res1;
	image.copyTo(res1);
	salt(res1, 100);
	imshow("salt_彩色", res1);

	Mat res2(image.cols,image.rows,CV_8U,cv::Scalar(0));
	salt(res2, 100);
	imshow("salt_黑白", res2);
	waitKey(0);

	Mat result;
	result.create(image.size(), image.type());
	sharpen2D(image, result);
	imshow("sharpen", result);

	imshow("lena",image);
	colorReduce(image);
	imshow("reduce64",image);
	double duration;
	duration=static_cast<double>(cv::getTickCount());
	colorReduce(image,8);
	duration=static_cast<double>(cv::getTickCount())-duration;
	duration/=cv::getTickFrequency();
	cout<<"time cost is "<<duration<<" ms."<<endl; 
	imshow("reduce8",image);
	waitKey(0);
}

相應的效果圖如下:





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章