• 图像通道处理

图像读取和处理都是按BGR通道顺序进行的

 #include <iostream>
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp" int main(int argc, char **argv) {
cv::Mat src = cv::imread("/home/cv/Downloads/images/P1180141.JPG", );
cv::resize(src, src, cv::Size(src.cols / , src.rows / ), cv::INTER_CUBIC);
cv::imshow("original_after_resize", src); // blue channel
cv::Mat mytemp1(src.rows, src.cols, CV_8UC3, cv::Scalar(, , ));
cv::imshow("temp test", mytemp1);
// green channel
cv::Mat mytemp2(src.rows, src.cols, CV_8UC3, cv::Scalar(, , ));
cv::imshow("temp test", mytemp2);
// red channel
cv::Mat mytemp3(src.rows, src.cols, CV_8UC3, cv::Scalar(, , ));
cv::imshow("temp test", mytemp3);
cv::waitKey();
return ;
}

或者使用mixChannels函数

 #include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp" int main(int argc, char **argv) {
cv::Mat src = cv::imread("/home/cv/Downloads/images/P1180141.JPG", );
cv::resize(src, src, cv::Size(src.cols / , src.rows / ), cv::INTER_CUBIC);
for (int i = ; i < ; i++) {
cv::Mat temp_bgr(src.rows, src.cols, CV_8UC3, cv::Scalar(, , ));
cv::Mat temp(src.rows, src.cols, CV_8UC1);
cv::Mat out[] = {temp_bgr};
int from_to[] = {i, i};
cv::mixChannels(&src, , out, , from_to, );
cv::imshow("single channel", temp_bgr);
cv::waitKey();
} return ;
}

转换到HSV颜色空间查看效果

 #include <iostream>
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp" int main(int argc, char **argv) {
cv::Mat src = cv::imread("/home/cv/Downloads/images/P1180141.JPG", );
cv::resize(src, src, cv::Size(src.cols / , src.rows / ), cv::INTER_CUBIC);
cv::imshow("original_after_resize", src); cv::Mat img_hsv;
cv::cvtColor(src, img_hsv, CV_BGR2HSV);
cv::Mat dst;
dst.create(img_hsv.size(), img_hsv.depth()); int ch[] = {, };
int ch1[] = {, };
int ch2[] = {, }; // Hue 色调通道
cv::mixChannels(&img_hsv, , &dst, , ch, );
cv::imshow("hsv-h", dst);
// Saturation 饱和度通道
cv::mixChannels(&img_hsv, , &dst, , ch1, );
cv::imshow("hsv-s", dst);
// Lightness/Value 亮度/像素值通道
cv::mixChannels(&img_hsv, , &dst, , ch2, );
cv::imshow("hsv-v", dst);
cv::waitKey(); return ;
}

转换到YUV空间或YCrCb空间查看效果

 #include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp" int main(int argc, char **argv) {
cv::Mat src = cv::imread("/home/cv/Downloads/images/P1180141.JPG", );
cv::resize(src, src, cv::Size(src.cols / , src.rows / ), cv::INTER_CUBIC);
cv::imshow("original_after_resize", src); // YUV color space
cv::Mat img_yuv;
cv::cvtColor(src, img_yuv, CV_BGR2YUV);
cv::Mat dst;
dst.create(img_yuv.size(), img_yuv.depth()); // Luminance, 明亮度,灰度值
int ch[] = {, };
cv::mixChannels(&img_yuv, , &dst, , ch, );
cv::imshow("yuv-y", dst);
// Chrominance, 色彩及饱和度,指定像素的颜色
int ch1[] = {, };
cv::mixChannels(&img_yuv, , &dst, , ch1, );
cv::imshow("yuv-u", dst);
int ch2[] = {, };
cv::mixChannels(&img_yuv, , &dst, , ch2, );
cv::imshow("yuv-v", dst); // YCrCb color space
cv::Mat ycrb;
cv::cvtColor(src, ycrb, CV_BGR2YCrCb);
std::vector<cv::Mat> mv;
cv::split(ycrb, (std::vector<cv::Mat>&) mv); // Y channel
cv::Mat chy(src.rows, src.cols, CV_8UC1);
chy = mv[].clone();
cv::imshow("Y", chy);
// Cr and Cb channel
// Cr反映RGB输入信号红色部分与RGB信号亮度值之间的差异
// Cb反应RGB输入信号蓝色部分与RGB信号亮度值之间的差异
cv::Mat chu(src.rows, src.cols, CV_8UC1);
chu = mv[].clone();
cv::imshow("Cr", chu);
cv::Mat chv(src.rows, src.cols, CV_8UC1);
chv = mv[].clone();
cv::imshow("Cb", chv);
cv::waitKey(); return ;
}
  •  cv::Mat 类型的成员函数 depth 

查看官方文档

inline
int Mat::depth() const
{
return CV_MAT_DEPTH(flags);
}

其中的 CV_MAT_DEPTH 定义如下

#define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)

这里的 CV_MAT_DEPTH_MASK 定义如下

#define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)

宏定义中的 CV_DEPTH_MAX 定义如下

#define CV_CN_SHIFT 3
#define CV_DEPTH_MAX (1 << CV_CN_SHIFT)

Mat::type
Returns the type of a matrix element.

C++: int Mat::type() const
The method returns a matrix element type. This is an identifier compatible with the CvMat type system, like CV_16SC3 or 16-bit signed 3-channel array, and so on.

表格来源(OpenCV学习十七:OpenCV中Mat的type)

出处暂不可考

Mat::depth
Returns the depth of a matrix element.

C++: int Mat::depth() const
The method returns the identifier of the matrix element depth (the type of each individual channel). For example, for a 16-bit signed element array, the method returns CV_16S . A complete list of matrix types contains the following values:

#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
#define CV_USRTYPE1 7
CV_8U - -bit unsigned integers ( .. )
CV_8S - -bit signed integers ( -.. )
CV_16U - -bit unsigned integers ( .. )
CV_16S - -bit signed integers ( -.. )
CV_32S - -bit signed integers ( -.. )
CV_32F - -bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
CV_64F - -bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

转换函数

void cv::transform (InputArray src,
OutputArray dst,
InputArray m
) The function cv::transform performs the matrix transformation of every element of the array src and stores the results in dst :

OpenCV-3.4.3图像通道处理的更多相关文章

  1. OpenCV 第二课 认识图像的存储结构

    OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...

  2. opencv笔记2:图像ROI

    time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...

  3. opencv分水岭算法对图像进行切割

    先看效果 说明 使用分水岭算法对图像进行切割,设置一个标记图像能达到比較好的效果,还能防止过度切割. 1.这里首先对阈值化的二值图像进行腐蚀,去掉小的白色区域,得到图像的前景区域.并对前景区域用255 ...

  4. 跟我一起学opencv 第二课之图像的掩膜操作

    1.掩膜(mask)概念 用选定的图像,图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程.用于覆盖的特定图像或物体称为掩模或模板.光学图像处理中,掩模可以足胶片,滤光片等 ...

  5. openCV学习——一、图像读取、显示、输出

    openCV学习——一.图像读取.显示.输出   一.Mat imread(const string& filename,int flags=1),用于读取图片 1.参数介绍 filename ...

  6. 深入学习OpenCV检测及分割图像的目标区域

    准备1:OpenCV常用图片转换技巧 在进行计算机视觉模型训练前,我们经常会用到图像增强的技巧来获取更多的样本,但是有些深度学习框架中的方法对图像的变换方式可能并不满足我们的需求,所以掌握OpenCV ...

  7. 图像通道、Scalar、分离、合成通道

    http://lib.csdn.net/article/opencv/33264 http://blog.csdn.net/laohu_tiger/article/details/17359777 h ...

  8. 用python简单处理图片(2):图像通道\几何变换\裁剪

    一.图像通道 1.彩色图像转灰度图 from PIL import Image import matplotlib.pyplot as plt img=Image.open('d:/ex.jpg') ...

  9. Halcon学习之三:有关图像通道的函数(R是三通道,B是1通道,G二通道),排列顺序BGR

    黑白摄像机会返回每个像素所对应的能量采用结果,这些结果组成了一幅单通道灰度值图像,而对于RGB彩色摄像机,它将返回每个像素所对应的三个采样结果,也就是一幅三通道图像.下面这些是与图像通道有关的函数: ...

随机推荐

  1. Python3 并发编程3

    目录 GIL全局解释器锁 基本概念 多线程的作用 死锁现象 递归锁 信号量 线程队列 GIL全局解释器锁 基本概念 global interpreter lock 全局解释器锁 GIL不是Python ...

  2. Ansible-上部

    Ansible概述 Ansible是一个配置管理系统configuration management systempython 语言是运维人员必须会的语言ansible 是一个基于python 开发的 ...

  3. Kubernetes服务发现入门:如何高效管理服务?

    愈发复杂的应用程序正在依靠微服务来保持可扩展性和提升效率.Kubernetes为微服务提供了完美的环境,并能够让其与Kubernetes的工具组件和功能兼容.当应用程序的每个部分放置在一个容器中,整个 ...

  4. 基于TCP协议之socket编程

    #服务端 #导入一个socket模块 import socket #想象成买手机打电话:socket.SOCK_STREAM 表示建立tcp连接 ,udp连接socket.SOCK_DGRAM #买了 ...

  5. Python之工作方向

    "python基础-->(函数/面向对象/网络编程(scoket套接字)/并发编程(mutiprocessing)) "运维+web开发-->页面展示(django/f ...

  6. ClassNotFoundException------我有一句妈卖批一定要讲

    最近在写<Writing Compilers and Interpreters>一书的代码,本来打算用vim敲代码,一来每个字母都要自己敲,而来就当练习vim,但是感觉真是太不方便了,各种 ...

  7. 《Java算法》判重算法-整数判重

    判重算法-整数判重 /** * 判断大于1,小于63的整数是否出现重复数字. * * 算法逻辑:先获取8 根据移位(1 << arrInt[i]) 得到2进制数100000000 , * ...

  8. .NET Core依赖注入集成Dynamic Proxy

    在<Castle DynamicProxy基本用法>中介绍了如何将DP与Autofac集成使用,而 .NET Core有自己的依赖注入容器,在不依赖第三方容器的基础上,如何实现动态代理就成 ...

  9. oracle中add_months()函数总结

    今天对add_months函数进行简单总结一下: add_months 函数主要是对日期函数进行操作,在数据查询的过程中进行日期的按月增加,其形式为: add_months(date,int);其中第 ...

  10. docker安装redis 5.0.7并挂载外部配置和数据

    环境 CentOS Linux release 7.7.1908 (Core) 拉取redis 5.0.7 镜像 docker pull redis:5.0.7 创建挂载目录 mkdir -p /ho ...