OPENCV基础篇

目录

读写图片 imread

显示图片 imshow

保存图片 imwrite

二值化

全局二值化

局部二值化

彩色转灰色


读写图片 imread

Mat imread( const String& filename, int flags = IMREAD_COLOR );

imread功能是加载图像文件成为一个Mat对象,如果路径为空返回空矩阵

  •  filename 表示图像文件名称
  •  flags  表示加载的图像是什么类型,支持常见的三个参数值
  1. IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变

  2. IMREAD_GRAYSCALE (0)表示把原图作为灰度图像加载进来,如下这行代码就是加载灰度图像.

  3.  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;
}

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值