今天主要学习《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);
}
相应的效果图如下: