OpenCV: 图片显示及图片颜色空间转换

OpenCV: 图片显示及图片颜色空间转换 bonjour 2023-11-30 17:44:37 600

在C++中使用OpenCV进行图片显示和颜色空间转换时,你可能会用到以下一些常用函数:

  1. 图片加载和保存函数:

cv::imread:加载图片文件。

cv::imwrite:保存图片到文件。

  1. 图片显示函数:

cv::imshow:在窗口中显示图像。

cv::namedWindow:创建一个具有给定名称的窗口。

cv::destroyWindow:关闭指定名称的窗口。

  1. 颜色空间转换函数:

cv::cvtColor:执行颜色空间转换。

1、Mat

cv::Mat 是OpenCV中用于表示图像和矩阵的主要数据结构之一。它是一个多维数组,用于存储图像的像素值和进行图像处理操作。

cv::Mat 的构造函数有多种形式,常用的有:

cv::Mat()
默认构造函数,创建一个空的 cv::Mat 对象。

cv::Mat(int rows, int cols, int type)
创建一个指定行数、列数和像素类型的 cv::Mat 对象。例如,cv::Mat image(480, 640, CV_8UC3) 创建一个大小为 480x640 的 3 通道彩色图像。

cv::Mat(int rows, int cols, int type, const Scalar& s)
创建一个指定行数、列数、像素类型和初始值的 cv::Mat 对象。Scalar 是一个用于表示多通道像素值的类。例如,cv::Mat image(480, 640, CV_8UC3, cv::Scalar(0, 0, 255))创建一个大小为 480x640 的 3 通道彩色图像,并将所有像素的初始值设置为红色(BGR:0, 0, 255)。

cv::Mat(const Mat& m)
拷贝构造函数,用于创建一个与给定 cv::Mat 对象相同的副本。

cv::Mat 对象可以通过访问其成员函数和数据成员来进行操作和访问图像数据。一些常用的操作和成员函数包括:

rows()cols():返回图像的行数和列数。

size():返回图像的大小(行数和列数)。

channels():返回图像的通道数。

depth():返回图像的深度,即每个像素值的数据类型。

empty():检查图像是否为空(即没有分配内存)。

clone():创建并返回一个与原始图像数据相同的副本。

at():用于访问图像中的像素值。

除了用于表示图像,cv::Mat 还可以用于存储和处理其他类型的矩阵数据。它提供了丰富的函数和操作符,用于对矩阵进行数学运算、线性代数操作、图像处理等。

2、imread()

cv::imread是OpenCV中用于加载图像文件的函数。它的完整函数签名如下:

cv::Mat cv::imread(const std::string& filename, int flags);

函数参数说明如下:

filename:图像文件的路径和名称。

flags:可选参数,用于指定读取图像的方式。可以是以下标志之一:

cv::IMREAD_COLOR(默认):加载图像并将其转换为BGR颜色空间(三通道彩色图像)。

cv::IMREAD_GRAYSCALE:以灰度模式加载图像(单通道灰度图像)。

cv::IMREAD_UNCHANGED:加载图像,并保留其原始通道数和深度。

函数返回一个 cv::Mat 对象,即图像的矩阵表示。

3、imwrite()

cv::imwrite是OpenCV中用于将图像保存为文件的函数。它的完整函数签名如下:

bool cv::imwrite(const std::string& filename, const cv::Mat& image, const std::vector<int>& params = std::vector<int>());

函数参数说明如下:

filename:保存图像的路径和名称。

image:要保存的图像,以 cv::Mat 对象表示。

params:可选参数,用于指定保存图像的方式。可以是保存图像质量、压缩格式等参数的设置。具体的参数取决于图像保存的文件格式。

函数返回一个布尔值,表示图像是否成功保存到文件中。

4、imshow

cv::imshow是OpenCV中用于在窗口中显示图像的函数。它的完整函数签名如下:

void cv::imshow(const std::string& winname, const cv::Mat& image);

函数参数说明如下:

winname:窗口的名称,用于标识显示图像的窗口。

image:要显示的图像,以 cv::Mat 对象表示。

cv::imshow函数将图像显示在具有给定名称的窗口中。如果窗口不存在,则会创建一个新窗口。如果窗口已存在,则会更新窗口中显示的图像。

5、namedWindow

cv::namedWindow 是OpenCV中用于创建一个具有指定名称的窗口的函数。它的完整函数签名如下:

void cv::namedWindow(const std::string& winname, int flags = cv::WINDOW_AUTOSIZE);

函数参数说明如下:

winname:窗口的名称,用于标识窗口。

flags:可选参数,用于指定窗口的标志。可以是以下标志之一:

cv::WINDOW_NORMAL:窗口大小可以调整。

cv::WINDOW_AUTOSIZE(默认):窗口大小根据图像大小自动调整。

cv::namedWindow 函数用于创建一个具有指定名称的窗口,以便在该窗口中显示图像或进行其他用户界面操作。如果窗口名称已存在,则此函数不执行任何操作。

6、destroyWindow

cv::destroyWindow 是 OpenCV 中用于关闭指定名称的窗口的函数。它的函数签名如下:

void cv::destroyWindow(const std::string& winname);

函数参数说明如下:

winname:要关闭的窗口的名称。

cv::destroyWindow函数用于关闭具有指定名称的窗口。如果窗口不存在或已经关闭,该函数不执行任何操作。

7、cvtColor()

cv::cvtColor 是 OpenCV 中用于图像颜色空间转换的函数。它可以将一个图像从一种颜色表示方式转换为另一种颜色表示方式。常见的颜色空间转换包括灰度化、RGB 到 HSV 的转换等。

cv::cvtColor 的函数签名如下:

void cv::cvtColor(const cv::Mat& src, cv::Mat& dst, int code, int dstCn = 0);

函数参数说明如下:

src:输入图像,以 cv::Mat 对象表示。

dst:输出图像,以 cv::Mat 对象表示。

code:颜色转换代码,用于指定所需的颜色转换类型。可以是 cv::ColorConversionCodes 中定义的常量之一。

dstCn:可选参数,输出图像的通道数。默认值为 0,表示与输入图像的通道数相同。

cv::cvtColor 函数将输入图像 src 转换为指定的颜色空间,并将结果存储在输出图像 dst 中。输出图像的大小和类型与输入图像相同,除非指定了不同的通道数。

常用的颜色空间转换代码:

cv::COLOR_BGR2GRAY:BGR 到灰度图像的转换。

cv::COLOR_GRAY2BGR:灰度图像到BGR 的转换。

cv::COLOR_BGR2RGB:BGR 到 RGB 的转换。

cv::COLOR_RGB2BGR:RGB 到 BGR 的转换。

cv::COLOR_BGR2HSV:BGR 到 HSV 的转换。

cv::COLOR_HSV2BGR:HSV 到 BGR 的转换。

cv::COLOR_BGR2Lab:BGR 到 Lab 的转换。

cv::COLOR_Lab2BGR:Lab 到 BGR 的转换。

cv::COLOR_BGR2YCrCb:BGR 到 YCrCb 的转换。

cv::COLOR_YCrCb2BGR:YCrCb 到 BGR 的转换。

8、OpenCV颜色空间转换实践

首先,定义一个cvtcolor_test.h作为颜色空间转换类的头文件:

8.1 cvtcolor_test.h文件
#pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
#include <memory>
using namespace cv;

class CCvtColorTest
{
public:
    void colorSpaceDemo(Mat& img);
};

using CCvtColorTestPtr = std::shared_ptr<CCvtColorTest>;

然后,在cvtcolor_test.cpp文件中实现具体的颜色空间转换逻辑:

8.2 cvtcolor_test.cpp文件
#include "cvtcolor_test.h"

void CCvtColorTest::colorSpaceDemo(Mat& img)
{
    Mat gray_img, hsv_img, ycrcb_img, lab_img, luv_img; 
    cvtColor(img, hsv_img, COLOR_BGR2HSV); 
    cvtColor(img, gray_img, COLOR_BGR2GRAY); 
    cvtColor(img, ycrcb_img, COLOR_BGR2YCrCb);
    cvtColor(img, lab_img, COLOR_BGR2Lab);
    cvtColor(img, luv_img, COLOR_BGR2Luv);

    imshow("Hsv", hsv_img);
    imshow("Gray", gray_img);
    imshow("YCrcb", ycrcb_img);
    imshow("Lab", lab_img);
    imshow("Luv", luv_img);
    imwrite("D:/PHOTO&VIDEO/image_test/test_img_hsv.png", hsv_img);
    imwrite("D:/PHOTO&VIDEO/image_test/test_img_gray.png", gray_img);
    imwrite("D:/PHOTO&VIDEO/image_test/test_img_ycrcb.png", ycrcb_img);
    imwrite("D:/PHOTO&VIDEO/image_test/test_img_lab.png", lab_img);
    imwrite("D:/PHOTO&VIDEO/image_test/test_img_luv.png", luv_img);
}

最后,在主函数中进行调用使用:

#include <iostream>
#include "cvtcolor_test.h"
using namespace std;
using namespace cv;


int main(int argc, char* argv)
{
    Mat src = imread("D:/PHOTO&VIDEO/image_test/test_img.png", IMREAD_ANYCOLOR); 
    if (src.empty())
    {
        std::cout << "could not load image!" << std::endl; 
        return -1;
    }

    namedWindow("input windows: ", WINDOW_FREERATIO); 
    imshow("input windows: ", src); 

    CCvtColorTestPtr cvtcolor_test;
    cvtcolor_test = std::make_shared<CCvtColorTest>();
    cvtcolor_test->colorSpaceDemo(src);

    waitKey(0);
    destroyAllWindows();

    return 0;
}

结果如图所示:

在以上颜色转换空间类中,我们使用 OpenCV 的 cvtColor 函数将输入图像 img 转换为不同的颜色空间。下面是每个转换的解释:

cvtColor(img, hsv_img, COLOR_BGR2HSV);:将 BGR 彩色图像 img 转换为 HSV(色调、饱和度、亮度)颜色空间,并将结果保存在hsv_img 中。

cvtColor(img, gray_img, COLOR_BGR2GRAY);:将 BGR 彩色图像 img 转换为灰度图像,并将结果保存在 gray_img 中。灰度图像只包含亮度信息,每个像素的值表示原始彩色图像中相应像素的亮度级别。

cvtColor(img, ycrcb_img, COLOR_BGR2YCrCb);:将 BGR 彩色图像 img 转换为 YCrCb(亮度、红色差、蓝色差)颜色空间,并将结果保存在 ycrcb_img 中。YCrCb 颜色空间表示颜色的亮度和色度分量。

cvtColor(img, lab_img, COLOR_BGR2Lab);:将 BGR 彩色图像 img 转换为 Lab(亮度、绿-红色度、蓝-黄色度)颜色空间,并将结果保存在 lab_img 中。Lab 颜色空间包含亮度信息和颜色信息。

cvtColor(img, luv_img, COLOR_BGR2Luv);:将 BGR 彩色图像 img 转换为 Luv(亮度、色度)颜色空间,并将结果保存在 luv_img 中。Luv 颜色空间是一种设备无关的颜色空间,用于描述人类可见的所有颜色。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
bonjour
红包 2 1 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
bonjour
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区