目录
读写图片 imread
Mat imread( const String& filename, int flags = IMREAD_COLOR );
imread功能是加载图像文件成为一个Mat对象,如果路径为空返回空矩阵
- filename 表示图像文件名称
- flags 表示加载的图像是什么类型,支持常见的三个参数值
-
IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变
-
IMREAD_GRAYSCALE (0)表示把原图作为灰度图像加载进来,如下这行代码就是加载灰度图像.
-
IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来
注意:OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载
显示图片 imshow
void imshow(const String& winname, InputArray mat);
- winname 窗口名称
- mat 要显示的图片对象
保存图片 imwrite
bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
- const String& filename 表示需要写入的文件名,必须要加上后缀,比如 test.jpg;
- InputArray img 表示 Mat 类型的图像数据;
- const std::vector& params 表示为特定格式保存的参数编码,它有一个默认值 std::vector< int >(),所以一般情况下不用写。
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
//读取图片
Mat image = imread("./test3.jpg", 0);
Mat dst;
resize(image, dst, Size(0,0),0.3,0.3);
imshow("图片",dst);
imwrite("test.jpg", dst);
waitKey(0); //
return 0;
}
运行结果:
二值化
全局二值化
二值化是将图片中的像素点设置为0(黑色)或者255(白色)使用threshold方法可以设置图片的阈值,将小于阈值的像素点设置为0.大于阈值的设置为255.
CV_EXPORTS_W double threshold( InputArray src, OutputArray dst,
double thresh, double maxval, int type );
- src 输入图,中只能输入单通道图,一般就是灰度图
- dst 输出数组/图像(与 src 相同大小和类型以及相同通道数的数组/图像)
- thresh 阈值;
- maxval 最大值,当像素超过了阈值(或者小于阈值)时所赋予的值;
- type 二值化操作的类型,有 5 种
二值化操作类型(阈值类型):
THRESH_BINARY | 二进制阈值化 | 将大于阈值的像素值设置为255,将其它像素设置为0 |
THRESH_BINARY_INV | 反二进制阈值化 | 将大于阈值的像素值设置为0,将其它像素设置为255 |
THRESH_TRUNC | 截断阈值化 | 将大于阈值的像素值设置为阈值,其它像素值不变 |
THRESH_TOZERO | 阈值化为 0 | 将大于阈值的像素值设置为0,其它像素值不变 |
THRESH_TOZERO_INV | 反阈值化为 0 | 将小于阈值的像素值设置为0,其它像素值不变 |
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void global_threshold()
{
//读取图片
Mat image = imread("./test3.jpg", 0);
Mat BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV;
resize(image, image, Size(0, 0), 0.2, 0.2);
imshow("原图", image);
threshold(image, BINARY, 127, 255, THRESH_BINARY);
imshow("BINARY", BINARY);
threshold(image, BINARY_INV, 127, 255, THRESH_BINARY_INV);
imshow("THRESH_BINARY", BINARY_INV);
threshold(image, TRUNC, 127, 255, THRESH_TRUNC);
imshow("TRUNC", TRUNC);
threshold(image, TOZERO, 127, 255, THRESH_TOZERO);
imshow("TOZERO", TOZERO);
threshold(image, TOZERO_INV, 127, 255, THRESH_TOZERO_INV);
imshow("TOZERO_INV", TOZERO_INV);
}
int main()
{
global_threshold();
waitKey(0); //
destroyAllWindows();
return 0;
}
运行结果:
局部二值化
CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
double maxValue, int adaptiveMethod,
int thresholdType, int blockSize, double C );
- src 输入图像(8 位单通道图像)
- dst 输出图像
- maxValue 使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值
- adaptiveMethod 自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)
- thresholdType 阈值类型,必须为 THRESH_BINARY 或 THRESH_BINARY_INV 的阈值类型
- blockSize 块大小(奇数且大于 1 )
- C 常数,从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值
adaptiveMethod:决定如何计算阈值
ADAPTIVE_THRESH_MEAN_C:阈值是邻域的平均值
ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值的加权和,其中权重是高斯窗口
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void local_threshold()
{
Mat image = imread("./test3.jpg", 0);
resize(image, image, Size(0, 0), 0.3, 0.3);
imshow("原图", image);
Mat dst1,dst2;
adaptiveThreshold(image, dst1, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 13,10);
imshow("GAUSSIAN", dst1);
adaptiveThreshold(image, dst2, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 13, 10);
imshow("MEAN", dst2);
}
int main()
{
local_threshold();
waitKey(0); //
destroyAllWindows();
return 0;
}
运行结果:
彩色转灰色
彩色图的图片是三通道(RGB),单通道的图片是二维的矩阵,像素值为0-255
如果R=G=B,则图片显示为灰度
1.使用imread函数,参数flags 传0,读取的图片就是灰度图
2.使用split对三通道的图像进行分割
void split(InputArray m, OutputArrayOfArrays mv)
int main()
{
Mat image = imread("./test3.jpg", 1);
vector<Mat> dst;;
resize(image, image, Size(0, 0), 0.2, 0.2);
split(image, dst);
imshow("原图",image);
imshow("1", dst[0]);
imshow("2", dst[1]);
imshow("3", dst[2]);
waitKey(0); //
destroyAllWindows();
return 0;
}
3.cvtColor根据code从原始颜色空间转换为目标颜色空间
CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
src:输入图像
dst:输出图像
code:颜色空间转换码,表示要进行的颜色空间转换类型。例如,COLOR_BGR2GRAY表示将BGR格式的图像转换为灰度图像。
dstCn:输出图像的通道数,默认值为0,表示与输入图像的通道数相同。
int main()
{
Mat image = imread("./test3.jpg", 1);
Mat dst1, dst2, dst3;
resize(image, image, Size(0, 0), 0.2, 0.2);
cvtColor(image, dst1, COLOR_BGR2RGB);
cvtColor(image, dst2, COLOR_BGR2GRAY);
cvtColor(image, dst3, COLOR_BGR2HSV);
imshow("image", image);
imshow("dst1", dst1);
imshow("dst2", dst2);
imshow("dst3", dst3);
waitKey(0); //
//destroyAllWindows();
return 0;
}
窗口控制
1.创建窗口
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
WINDOW_NORMAL | 窗口大小可以改变 |
WINDOW_AUTOSIZE | 窗口大小不可以改变 |
WINDOW_FREERATIO | 窗口大小自适应比例 |
WINDOW_KEEPRATIO | 窗口大小保持比例 |
WINDOW_GUI_EXPANDED | 窗口中可显示状态栏和工具栏 |
WINDOW_FULLSCREEN | 窗口将全屏显示 |
2.关闭窗口
destroyAllWindows();
3.调整窗口
void resizeWindow(const String& winname, const cv::Size& size);
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("./test3.jpg", 1);
resize(image, image, Size(0, 0), 0.2, 0.2);
namedWindow("image", WINDOW_NORMAL);
resizeWindow("image", Size(image.rows / 2, image.cols / 2));
imshow("image", image);
waitKey(0); //
destroyAllWindows();
return 0;
}