一、对图像某一像素临近区域的访问
#include "stdafx.h"
using namespace std;
using namespace cv;
void sharpen( const Mat &img,Mat &result)
{
for(int j = 1;j < img.rows-1;++j)
{
const uchar *previous = img.ptr<const uchar>(j-1);
const uchar *current = img.ptr<const uchar>(j);
const uchar *next = img.ptr<const uchar>(j+1);
uchar *output = result.ptr<uchar>(j);
for(int i =1;i < 3*(img.cols-1);++i)
{
*output++ = cv::saturate_cast<uchar>(
5*current[i]-current[i-1]-current[i+1]
-previous[i]-next[i]);
}
}
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 main()
{
Mat image = imread("E:\\4.jpg");
namedWindow("img");
imshow("img",image);
Mat result;
result.create(image.size(),image.type());
sharpen(image,result);
namedWindow("imageClone");
imshow("imageClone",result);
waitKey(0);
}
代码说明:实现了图像的锐化处理,采用的是拉普拉斯算子。定义了三个指针分别指向当前行、前一行和下一行。对边缘像素特殊处理,此处直接设置为0。
函数说明:
saturate_cast<uchar>() //因为对像素点进行拉普拉斯算子计算后,其值可能会小于0或者大于255。该函数将小于0的值设为0大于255的值设为255。若输入参数为浮点型,则去最接近的整型值。
result.row(0) //该函数将会返回一个单行的Mat类型实例,且不会产生新的内存分配,而是在result的基础之上。
setTo() //将指定矩阵的所有值设为一个指定的值。
二、算子用opencv函数实现的方式
void sharpen2D(const cv::Mat &image, cv::Mat &result) {
// Construct kernel (all entries initialized to 0)
cv::Mat kernel(3,3,CV_32F,cv::Scalar(0));
// assigns kernel values
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;
//filter the image
cv::filter2D(image,result,image.depth(),kernel);
}
代码说明: 我们只需定义模板算子矩阵, 将该矩阵传给filter2D()函数即可。
函数说明:
filter2D(image,result,image.depth(),kernel); //
三、过滤提取图像
// create vector of 3 images
std::vector<cv::Mat> planes;
// split 1 3-channel image into 3 1-channel images
cv::split(image1,planes);
// add to blue channel
planes[0]+= image2;
// merge the 3 1-channel images into 1 3-channel image
cv::merge(planes,result);
代码说明:将image2加到image1的蓝色通道,
函数说明:
split() //拷贝一幅图像的三个通道到三个Mat对象中。默认顺序为 蓝、绿、红。
merge() //创建一幅三通道的图像。
四、ROI区域的定义
1、利用Rect()结构定义一个矩形区域:imageROI= image(cv::Rect(385,270,logo.cols,logo.rows));
2、利用Range结构:cv::Mat imageROI= image(cv::Range(270,270+logo.rows),
cv::Range(385,385+logo.cols))
3、定义某行或某列为ROI
cv::Mat imageROI= image.rowRange(start,end) ;
cv::Mat imageROI= image.colRange(start,end) ;
//因为ROI区域没有拷贝原图像数据,所以对ROI的操作将会影响原图像。