像素临近区域、颜色通道、ROI区域的访问---opencv.2学习笔记2

来源:互联网 发布:北电网络倒闭了吗 编辑:程序博客网 时间:2024/05/21 11:06

一、对图像某一像素临近区域的访问

#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的操作将会影响原图像。


 

原创粉丝点击