文章目录
一、获取图像像素指针
- CV_Assert(myImage.depth() == CV_8U);
- Mat.ptr(int i=0) 获取像素矩阵的指针,索引i表示第几行,从0开始计行数。
- 获得当前行指针const uchar* current= myImage.ptr(row );
- 获取当前像素点P(row, col)的像素值 p(row, col) =current[col]
二、像素范围处理
saturate_cast< uchar>
- saturate_cast(-100),返回 0。
- saturate_cast(288),返回255
- saturate_cast(100),返回100
- 这个函数的功能是确保RGB值得范围在0~255之间
三、掩膜操作实现图像对比度调整
-
红色是中心像素,从上倒下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象
- 矩阵的掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask,也被称为kernel)
- 通过掩膜操作实现图像对比度提高。
四、综合例程
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc,char** argv)
{
Mat src,dst;
src = imread("1.jpg");
if(!src.data)
{
printf("could not load image...\n");
return -1;
}
nameWindow("input image",CV_WINDOW_AUTOSIZE);
imshow("input_image",src);
int cols = (src.cols-1)*src.channnels();
int offset = src.channels();
int rows = src.rows;
dst = Mat::zeros(src.size(),src.type() );
for(int row = 1;row < (rows - 1); row++)
{
const uchar* previous = src.ptr<uchar>(row - 1);
const uchar* current = src.ptr<uchar>(row);
const uchar* next = src.ptr<uchar>(row + 1);
uchar* output = dst.ptr<uchar>(row);
for(int col = offsetx; col < cols; col++)
{
output[col] = saturate_cast<uchar>(5 *current[col] - (current[col-offsex) + current[col+offset] + previous[col] + next[col]));
}
nameWindow("contrast.image.demo",CV_WINDOW_AUTOSIZE);
imshow("contrast.image.demo",dst);
waitKey(0);
return 0;
}
函数调用filter2D功能
- 定义掩膜:Mat kernel = (Mat_(3,3)<<0 ,-1 , 0, -1,5, -1, 0, -1, 0 );
- filter2D(src, dst, src.depth , kernel );其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc,char** argv)
{
Mat src,dst;
src = imread("1.jpg");
if(!src.data)
{
printf("could not load image...\n");
return -1;
}
nameWindow("input image",CV_WINDOW_AUTOSIZE);
imshow("input_image",src);
double t = getTickCount();
Mat kernel = (Mat_<char>(3,3)<<0, -1, 0, -1, 5, -1, 0, -1, 0 );
filter2D(src, dst, src.depth(), kernel);
double timeconsume = (getTickCount() - t) / getTrickFrequency();//计算程序运行的时间
printf("contrast.image.demo",dst);
nameWindow("contrast.dst.image.demo",CV_WINDOW_AUTOSIZE);
imshow("contrast.image.demo",dst);
waitKey(0);
return 0;
}
五、附注
1.OpenCV坐标系与row&col的关系
Mat::at(x,y) 和 Mat::at( Point(x, y) )的区别
row == heigh == Point.y col == width == Point.x Mat::at(Point(x, y)) == Mat::at(y,x)
2.getTickCount() & getTrickFrequency()
getTickCount():用于返回从操作系统气筒到当前所经的计时周期数。
getTcikFrequency():用于返回CPU的频率。(C++中单位为秒,也就是每秒重复的次数
.getTickCount() & getTrickFrequency()getTickCount():用于返回从操作系统气筒到当前所经的计时周期数。
getTcikFrequency():用于返回CPU的频率。(C++中单位为秒,也就是每秒重复的次数
(getTickCount() - t) / getTcikFrequency():(当前次数-开始计时次数)/每秒重复次数=从开始到当前所用时间(s)