• 图像通道处理

图像读取和处理都是按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. Python 3 对象关系映射(ORM)

    ORM 对象关系映射 Object Relational Mapping 表 ---> 类 字段 ---> 属性 记录 ---> 对象 # mysql_client.py impor ...

  2. 【React】393 深入了解React 渲染原理及性能优化

    如今的前端,框架横行,出去面试问到框架是常有的事. 我比较常用React, 这里就写了一篇 React 基础原理的内容, 面试基本上也就问这些, 分享给大家. React 是什么 React是一个专注 ...

  3. centos7 7.3php编译安装

    1.首先更新依赖包. yum -y update 2.安装依赖包 yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bz ...

  4. Kubernetes 应用部署实战

    Kubernetes 应用部署实战 2018-08-08 19:44:56 wuxiangping2017 阅读数 3084  收藏 更多 分类专栏: linux运维与架构师   简介 伙计们,请搬好 ...

  5. 【TCP/IP网络编程】:04基于TCP的服务器端/客户端

    摘要:结合前面所讲述的知识,本篇文章主要介绍了简单服务器端和客户端实现的框架流程及相关函数接口. 理解TCP和UDP 根据数据传输方式的不同,基于网络协议的套接字一般分为TCP套接字和UDP套接字(本 ...

  6. YiluPHP是如何做到不用配置、不用注入就能直接使用所有的类?

    使用过YiluPHP的人都会发现,不管是模型类还是逻辑类.辅助类还是工具类,使用所有类都不需要在配置文件中设置加载或注入,也不需要在页面中使用 include 或 require 或 use ,直接使 ...

  7. JS---案例:筋斗云

    案例:筋斗云 鼠标进入,一朵云的样式跟随鼠标移动,鼠标点击后离开,云样式回到上次点击的位置 <!DOCTYPE html> <html lang="en"> ...

  8. Hack the Breach 2.1 VM (CTF Challenge)

    主机扫描: ╰─ nmap -p- -A 192.168.110.151Starting Nmap 7.70 ( https://nmap.org ) at 2019-08-29 09:48 CSTN ...

  9. ASP.NET Core on K8S深入学习(8)数据管理

    本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 在Docker中我们知道,要想实现数据的持久化(所谓Docker的数据持久化即 ...

  10. Python爬虫基础面试题,为2020年初就业做准备

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:qiaoziheng 一.题目部分1.python中常用的数据结构有哪些 ...