OpenCV学习C++接口:图像锐化
2014-05-01 09:49
591 查看
利用拉普拉斯算子进行图像锐化是数字图像处理里比较简单的处理手段,下面的例子参考opencv 2 computer vision application programming cookbook,采用两种方法对输入图像进行拉普拉斯锐化,原理比较简单,故不赘述了。
编译环境:VS2010+OpenCV2.3.1
编程细节:
函数的形参表中,为了防止修改输入图像image,故形参传递为pass by conference-const,同时函数体中指向输入图像的指针也必须声明为指向const对象的指针,如const uchar *next = image.ptr<const
uchar>(j);
cv::Mat::row()返回由单行或者单列组成的特定的cv::Mat实例,cv::Scalar(a,b,c)指定每个通道的特定值;
第二种方法中,利用函数cv::filter2D(),需先创建一个核cv::Mat,并对核进行初始化
/***************************************************************
*
* 内容摘要:分别用两种方法对输入图像进行拉普拉斯算子锐化,并比较
* 两种方法的执行效率,从运行结果来看,第二种方法的效率
*
***************************************************************/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
//输入形参为pass by conference-const,保证输入的图像不会被修改,并且为传递引用
void sharpenImage0(const cv::Mat &image, cv::Mat &result)
{
//为输出图像分配内存
result.create(image.size(),image.type());
/*滤波核为拉普拉斯核3x3:
0 -1 0
-1 5 -1
0 -1 0
*/
for(int j= 1; j<image.rows-1; ++j)
{
const uchar *previous = image.ptr<const uchar>(j-1);
const uchar *current = image.ptr<const uchar>(j);
const uchar *next = image.ptr<const uchar>(j+1);
uchar *output = result.ptr<uchar>(j);
for(int i= 1; i<image.cols-1; ++i)
{
*output++ = cv::saturate_cast<uchar>(5*current[i]-previous[i]-next[i]-current[i-1]-current[i+1]); //saturate_cast<uchar>()保证结果在uchar范围内
}
}
result.row(0).setTo(cv::Scalar(0));
result.row(result.rows-1).setTo(cv::Scalar(0));
result.col(0).setTo(cv::Scalar(0));
result.col(result.cols-1).setTo(cv::Scalar(0));
}
void sharpenImage1(const cv::Mat &image, cv::Mat &result)
{
//创建并初始化滤波模板
cv::Mat kernel(3,3,CV_32F,cv::Scalar(0));
kernel.at<float>(1,1) = 5.0;
kernel.at<float>(0,1) = -1.0;
kernel.at<float>(1,0) = -1.0;
kernel.at<float>(1,2) = -1.0;
kernel.at<float>(2,1) = -1.0;
result.create(image.size(),image.type());
//对图像进行滤波
cv::filter2D(image,result,image.depth(),kernel);
}
int main(int argc, char* argv[])
{
cv::Mat image = cv::imread("../boldt.jpg");
cv::Mat image_gray;
image_gray.create(image.size(),image.type());
if(!image.data)
return -1;
if(image.channels() == 3)
cv::cvtColor(image,image_gray,CV_RGB2GRAY);
cv::Mat result;
result.create(image_gray.size(),image_gray.type());
double time_ = static_cast<double>(cv::getTickCount());
sharpenImage0(image_gray,result);
time_ = 1000*(static_cast<double>(cv::getTickCount())-time_)/cv::getTickFrequency();
std::cout<<"time = "<<time_<<"ms"<<std::endl;
cv::namedWindow("Image 1");
cv::imshow("Image 1",result);
cv::Mat result1;
result1.create(image_gray.size(),image_gray.type());
time_ = static_cast<double>(cv::getTickCount());
sharpenImage1(image_gray,result1);
time_ = 1000*static_cast<double>(cv::getTickCount()-time_)/cv::getTickFrequency();
std::cout<<"time = "<<time_<<"ms"<<std::endl;
cv::namedWindow("Image 2");
cv::imshow("Image 2",result1);
cv::waitKey();
return 0;
}
编译环境:VS2010+OpenCV2.3.1
编程细节:
函数的形参表中,为了防止修改输入图像image,故形参传递为pass by conference-const,同时函数体中指向输入图像的指针也必须声明为指向const对象的指针,如const uchar *next = image.ptr<const
uchar>(j);
cv::Mat::row()返回由单行或者单列组成的特定的cv::Mat实例,cv::Scalar(a,b,c)指定每个通道的特定值;
第二种方法中,利用函数cv::filter2D(),需先创建一个核cv::Mat,并对核进行初始化
/***************************************************************
*
* 内容摘要:分别用两种方法对输入图像进行拉普拉斯算子锐化,并比较
* 两种方法的执行效率,从运行结果来看,第二种方法的效率
*
***************************************************************/
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
//输入形参为pass by conference-const,保证输入的图像不会被修改,并且为传递引用
void sharpenImage0(const cv::Mat &image, cv::Mat &result)
{
//为输出图像分配内存
result.create(image.size(),image.type());
/*滤波核为拉普拉斯核3x3:
0 -1 0
-1 5 -1
0 -1 0
*/
for(int j= 1; j<image.rows-1; ++j)
{
const uchar *previous = image.ptr<const uchar>(j-1);
const uchar *current = image.ptr<const uchar>(j);
const uchar *next = image.ptr<const uchar>(j+1);
uchar *output = result.ptr<uchar>(j);
for(int i= 1; i<image.cols-1; ++i)
{
*output++ = cv::saturate_cast<uchar>(5*current[i]-previous[i]-next[i]-current[i-1]-current[i+1]); //saturate_cast<uchar>()保证结果在uchar范围内
}
}
result.row(0).setTo(cv::Scalar(0));
result.row(result.rows-1).setTo(cv::Scalar(0));
result.col(0).setTo(cv::Scalar(0));
result.col(result.cols-1).setTo(cv::Scalar(0));
}
void sharpenImage1(const cv::Mat &image, cv::Mat &result)
{
//创建并初始化滤波模板
cv::Mat kernel(3,3,CV_32F,cv::Scalar(0));
kernel.at<float>(1,1) = 5.0;
kernel.at<float>(0,1) = -1.0;
kernel.at<float>(1,0) = -1.0;
kernel.at<float>(1,2) = -1.0;
kernel.at<float>(2,1) = -1.0;
result.create(image.size(),image.type());
//对图像进行滤波
cv::filter2D(image,result,image.depth(),kernel);
}
int main(int argc, char* argv[])
{
cv::Mat image = cv::imread("../boldt.jpg");
cv::Mat image_gray;
image_gray.create(image.size(),image.type());
if(!image.data)
return -1;
if(image.channels() == 3)
cv::cvtColor(image,image_gray,CV_RGB2GRAY);
cv::Mat result;
result.create(image_gray.size(),image_gray.type());
double time_ = static_cast<double>(cv::getTickCount());
sharpenImage0(image_gray,result);
time_ = 1000*(static_cast<double>(cv::getTickCount())-time_)/cv::getTickFrequency();
std::cout<<"time = "<<time_<<"ms"<<std::endl;
cv::namedWindow("Image 1");
cv::imshow("Image 1",result);
cv::Mat result1;
result1.create(image_gray.size(),image_gray.type());
time_ = static_cast<double>(cv::getTickCount());
sharpenImage1(image_gray,result1);
time_ = 1000*static_cast<double>(cv::getTickCount()-time_)/cv::getTickFrequency();
std::cout<<"time = "<<time_<<"ms"<<std::endl;
cv::namedWindow("Image 2");
cv::imshow("Image 2",result1);
cv::waitKey();
return 0;
}
相关文章推荐
- OpenCV学习C++接口:图像锐化
- OpenCV学习C++接口:图像遍历+像素压缩
- OpenCV(C++接口)学习笔记1-图像的读取、显示、保存
- OpenCV学习C++接口:图像遍历+像素压缩
- OpenCV(C++接口)学习笔记1-图像读取、显示、保存
- OpenCV学习C++接口:图像遍历+像素压缩
- OpenCV(C++接口)学习笔记2-像素级的图像操作
- opencv入门学习之六:拉普拉斯Laplacian变换锐化图像
- 有关opencv的学习(4)—图像的锐化
- 我的OpenCV学习笔记(三):利用操作像素完成简单的图像处理:加入椒盐噪声、图像翻转、改变对比度、图像锐化
- OpenCV学习C++接口 Mat像素遍历详解
- opencv入门学习之七:罗伯特Robert变换和Sobel变换锐化图像
- 小赵学习Opencv(2)之椒盐噪声及图像锐化
- Opencv学习笔记(四)--图像处理平滑,锐化操作
- OpenCV(C++接口)学习笔记3-求算法的运行时间
- 【基于C++和Python的Opencv3学习笔记之图像载入、显示和保存】
- opencv [c++版] 学习笔记(1) 显示图像及播放视频
- 学习《OpenCV 2 计算机视觉编程手册》第二章遍历图像和领域操作实例——对图像进行锐化
- OpenCV(C++接口)学习笔记4-Mat::operator = 的陷阱
- opencv学习笔记(3) 锐化图像 邻域操作 ROI