显示加载保存图像
加载图像(用cv::imread)
imread功能是加载图像文件成为一个Mat图像对象。其中第一个参数表示图像文件名称,第二个参数表示加载的图像是什么类型,支持常见的三个参数值:
IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变
IMREAD_GRAYSCALE (0)表示把原图作为灰度图像加载进来
IMREAD_COLOR (>0,不写默认flags=1) 表示把原图作为RGB图像加载进来
注意:OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载
输入图像默认读进来的方式RGB,但是三个通道的排序是BGR
Mat src = imread("E:/OpenCV/testimage/test.png", IMREAD_GRAYSCALE); //载入灰度图像
显示图像 (cv::namedWindow 与cv::imshow)
namedWindow 功能是创建一个OpenCV窗口。它是由OpenCV自动创建与释放,你无需取销毁它。常见用法namedWindow(“Window Title”, WINDOW_AUTOSIZE)
WINDOW_AUTOSIZE或CV_WINDOW_AUTOSIZE 会自动根据图像大小,显示窗口大小,不能人为改变窗口大小
WINDOW_NORMAL跟QT集成的时候会使用,允许修改窗口大小。
imshow 根据窗口名称显示图像到指定的窗口上去。第一个参数是窗口名称,第二参数是Mat对象
namedWindow("test opencv setup", WINDOW_AUTOSIZE); //创建窗口,自动大小
imshow("test opencv setup", src); //显示图像到指定的窗口
修改图像 (cv::cvtColor)
cvtColor 的功能是把图像从一个彩色空间转换到另外一个色彩空间。有三个参数,第一个参数表示源图像、第二参数表示色彩空间转换之后的图像变量名称、第三个参数表示目标色彩空间如:
COLOR_BGR2HLS通道亮度饱和度
COLOR_BGR2GRAY灰度等。
常见用法cvtColor( image, gray_image, COLOR_BGR2GRAY );
namedWindow("output windows", CV_WINDOW_AUTOSIZE);
Mat output_image;
cvtColor(src, output_image, CV_BGR2HLS); //修改图像为某色彩空间
imshow("output windows", output_image);
保存图像(cv::imwrite)
imwrite 保存图像文件到指定目录路径。只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存,保存PNG格式的时候可以保存透明通道的图片,可以指定压缩参数。
imwrite(“E:/my.tif”,output_image); //重命名为my.tif并保存到E盘
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("E:\\OpenCV\\testOpenCV\\testOpenCV\\mm.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("test opencv setup", WINDOW_AUTOSIZE); //创建窗口,自动大小
imshow("test opencv setup", src); //显示图像到指定的窗口
namedWindow("output windows", WINDOW_AUTOSIZE);
Mat output_image;
cvtColor(src, output_image, COLOR_BGR2HLS); //修改图像为某色彩空间
imshow("output windows", output_image);
imwrite("E:\\OpenCV\\testOpenCV\\testOpenCV\\my.tif", output_image);
waitKey(0);
return 0;
}
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src;
src = imread("D://0.jpg");
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image", src);
/*
Mat dst;
dst = Mat(src.size(), src.type());
dst = Scalar(127, 0, 255);
Mat dst = src.clone();
Mat dst;
src.copyTo(dst);
*/
Mat dst;
cvtColor(src, dst, COLOR_BGR2GRAY);
imshow("output image", dst);
int rows = dst.rows;
int cols = dst.cols;
printf("rows:%d\n", rows);
cout << "cols:" << cols << endl;
const uchar* fristRow = dst.ptr<uchar>(0);
cout << "*************************" << endl;
cout << "first pixel value:" << *fristRow << endl;
cout << "*************************" << endl;
Mat M1(3, 3, CV_8UC3, Scalar(127, 0, 255));
Mat M2(3, 3, CV_8UC1, Scalar(127));
Mat M3;
M3.create(4, 3, CV_8UC3);
M3 = Scalar(0, 0, 125);
Mat M4 = Mat::eye(2, 2, CV_8UC1);
Mat M5 = Mat::zeros(2, 2, CV_8UC1);
Mat M6 = Mat::zeros(src.size(), src.type());
cout << "M = " << endl << M1 << endl;
imshow("M1 image", M1);
imshow("M2 image", M2);
imshow("M3 image", M3);
imshow("M4 image", M4);
imshow("M5 image", M5);
imshow("M6 image", M6);
Mat csrc;
Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "kernel = " << endl << kernel << endl << endl;
filter2D(src, csrc, -1, kernel);
imshow("csrc image", csrc);
waitKey(0);
return 0;
waitKey(0);
return 0;
}
/*1.5 图像操作-修改像素*/
#include <opencv2/opencv.hpp> //包含头文件
#include <iostream>
using namespace cv; //使用cv命名空间
int main(int argc, char** argv) { //argc 表示命令行输入参数的个数(以空白符分隔),argv中存储了所有的命令行参数
Mat src = imread("E:/OpenCV/testimage/test5.jpg"); //载入图像
if (src.empty()) { //是不是为空
printf("could not load image...\n");
return -1;
}
namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE); //创建窗口,自动大小
imshow("test opencv setup", src); //显示图像,窗口标题
/*单通道读写像素*/
Mat gray_src;
cvtColor(src, gray_src, CV_BGR2GRAY); //转换为灰色
// namedWindow("gray_src", CV_WINDOW_AUTOSIZE);
// imshow("gray_src", gray_src);
int height = gray_src.rows;
int width = gray_src.cols;
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
int gray = gray_src.at<uchar>(row, col); //(读像素)读GRAY像素点的像素值
gray_src.at<uchar>(row, col) = 255 - gray; //(写像素)反差像素值
}
}
imshow("grary_invert", gray_src); //在3.x的版本里可以省略namedWindow,它会自动创建
/*三通道读写像素*/
Mat dst;
dst.create(src.size(), src.type());
height = src.rows;
width = src.cols;
int nc = src.channels();
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (nc == 1) {
int gray = gray_src.at<uchar>(row, col); //(读像素)读GRAY像素点的像素值
gray_src.at<uchar>(row, col) = 255 - gray; //(写像素)反差像素值
}
else if (nc == 3) {
int b = src.at<Vec3b>(row, col)[0]; //(读像素)读第一通道像素,Vec3b放了RGB的像素
int g = src.at<Vec3b>(row, col)[1]; //读第二通道像素
int r = src.at<Vec3b>(row, col)[2]; //读第三通道像素
dst.at<Vec3b>(row, col)[0] = 255 - b; //(写像素)反差像素值
dst.at<Vec3b>(row, col)[1] = g;
dst.at<Vec3b>(row, col)[2] = r;
gray_src.at<uchar>(row, col) = max(r, max(b, g));//每个像素都取最大值,就得到灰度图像(较亮)
// gray_src.at<uchar>(row, col) = min(r, min(b, g)); //每个像素都取最小值,就得到灰度图像(较暗)
}
}
}
// bitwise_not(src, dst); //位操作反差,所有通道像素全反差
imshow("grary_src_max", gray_src); //在3.x的版本里可以省略namedWindow,它会自动创建
imshow("dst_invert", dst); //在3.x的版本里可以省略namedWindow,它会自动创建
waitKey(0); //等待任意按键按下
return 0;
}