现在的位置: 首页 > 综合 > 正文

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

2013年06月27日 ⁄ 综合 ⁄ 共 2178字 ⁄ 字号 评论关闭

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

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

 

抱歉!评论已关闭.