22:38
加载图像 cv::imread
功能是加载图像文件成为一个Mat对象,
其中第一个参数表示图像文件名称
第二个参数表示加载的图像是什么类型,支持常见的三个参数值
IMREAD_UNCHANGED(<0)表示加载原图,不做任何改变
IMREAD_GRAYSCALE(0)表示把原图作为灰度图像加载进来
IMREAD_COLOR(>0)表示把原图作为RGB图像加载进来
注意:OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载
显示图像(cv::namedWindos与cv::imshow)
namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,无需去销毁它,(注意:早期版本需要destroy销毁)
常见用法namedWindow("Window Title",WINDOW_AUTOSIZE)
WINDOW_AUTOSIZE会自动根据图像大小,显示窗口大小,不能人为改变窗口大小
WINDOW_NORMAL跟QT集成的时候会使用,允许修改窗口大小
imshow根据窗口名称显示图像到指定窗口去,第一个参数是窗口名称,第二个参数是Mat对象
修改图像 cv::cvtColor
cvtColor的功能是把图像从一个彩色空间转换到另一个色彩空间,有三个参数,第一个参数表示源图像,第二个参数表示色彩空间转换后图像,第三个图像表示源和目标色彩空间如:COLOR_BGR2HLS、COLOR_BGR2GRAY等
cvtColor(image,gray_image,COLOR_BGR2GRAY);
保存图像 cv::imwrite
imwrite("路径名",图片名);
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
int main(int argc,char** argv){
Mat src = imread("路径名");
if(src.empty()){
printf("Could not load image...\n");
return -1;
}
namedWindow("opencv setup demo",CV_WINDOW_AUTOSIZE);
imshow("opencv setup demo",src);
namedWindow("output windows",CV_WINDOW_AUTOSIZE);
Mat output_image;
cvtColor(src,output_image,CV_BGR2HLS);
imshow("output windows",output_image);
imwrite("路径名",output_image);
waitKey(0);
return 0;
}
获取图像像素指针
CV_Assert(myImage.depth()==CV8U);
Mat.ptr<uchar>(int i = 0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数
获得当前行指针const uchar* current = myImage.ptr<uchar>(row);
获取当前像素点P(row,col)的像素值P(row,col)=current[col]
像素范围处理saturate_cast<uchar>
saturate_cast<uchar>(-100),返回0.
saturate_cast<uchar>(288),返回255
saturate_cast<uchar>(100),返回100
这个函数的功能是确保RGB值的范围在0~255之间
掩膜操作实现图像对比度调整
红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象
矩阵掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask也被称为Kernel)
通过掩膜操作实现图像对比度提高。
I(i,j)=5*I(i,j)-[I(i-1,j)+I(i+1,j)+I(i,j-1)+I(i,j+1)]
0 -1 0
-1 5 -1
0 -1 0
#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
int main(int argc;char** argv){
Mat src,dst;
src = imread("");
if(!src.data){
printf("Could not load image!");
return -1;
}
namedWindow("input image",CV_WINDOW_AUTOSIZE);
imshow("input image",src);
//
int cols = (src.cols - 1) * src.channels();
int offsetx = src.channels();
int rows = src.rows;
dst = Mat::zeros(src.size(),src.type());
for(int row = 1; row < (rows - 1);row++){
const uchar* current = src.ptr<uchar>(row);
const uchar* previous = src.ptr<uchar>(row - 1);
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 - offsetx] + current[col + offsetx] + previous[col] + next[col]));
}
}
namedWindow("output image",CV_WINDOW_AUTOSIZE);
imshow("output image",dst);
waitKey(0);
return 0;
}
OpenCV自带函数实现以上功能
函数调用filter2D功能
定义掩膜:Mat kernel = (Mat_<char>(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等。
注意:depth()不知道可以直接写-1
代码片段:(衡量程序执行时间)
Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
double t = (double)getTickCount();
filter2D(src,dst,src.depth(),kernel);
double timeconsume = ((double)getTickCount() - 5)/getTickFrequency();
cout<<"Built filter2D Time passes in seconds"<<timeconsume<<endl;
imshow("output",dst);
来源:CSDN
作者:Qsouler
链接:https://blog.csdn.net/Qsouler/article/details/104216044