OpenCV-3.4.3图像通道处理
- 图像通道处理
图像读取和处理都是按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图像通道处理的更多相关文章
- OpenCV 第二课 认识图像的存储结构
OpenCV 第二课 认识图像的存储结构 Mat Mat 类包含两部分,矩阵头和矩阵体.矩阵头包含矩阵的大小,存储方式和矩阵体存储空间的指针.因此,Mat中矩阵头的大小是固定的,矩阵体大小是不定的. ...
- opencv笔记2:图像ROI
time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...
- opencv分水岭算法对图像进行切割
先看效果 说明 使用分水岭算法对图像进行切割,设置一个标记图像能达到比較好的效果,还能防止过度切割. 1.这里首先对阈值化的二值图像进行腐蚀,去掉小的白色区域,得到图像的前景区域.并对前景区域用255 ...
- 跟我一起学opencv 第二课之图像的掩膜操作
1.掩膜(mask)概念 用选定的图像,图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程.用于覆盖的特定图像或物体称为掩模或模板.光学图像处理中,掩模可以足胶片,滤光片等 ...
- openCV学习——一、图像读取、显示、输出
openCV学习——一.图像读取.显示.输出 一.Mat imread(const string& filename,int flags=1),用于读取图片 1.参数介绍 filename ...
- 深入学习OpenCV检测及分割图像的目标区域
准备1:OpenCV常用图片转换技巧 在进行计算机视觉模型训练前,我们经常会用到图像增强的技巧来获取更多的样本,但是有些深度学习框架中的方法对图像的变换方式可能并不满足我们的需求,所以掌握OpenCV ...
- 图像通道、Scalar、分离、合成通道
http://lib.csdn.net/article/opencv/33264 http://blog.csdn.net/laohu_tiger/article/details/17359777 h ...
- 用python简单处理图片(2):图像通道\几何变换\裁剪
一.图像通道 1.彩色图像转灰度图 from PIL import Image import matplotlib.pyplot as plt img=Image.open('d:/ex.jpg') ...
- Halcon学习之三:有关图像通道的函数(R是三通道,B是1通道,G二通道),排列顺序BGR
黑白摄像机会返回每个像素所对应的能量采用结果,这些结果组成了一幅单通道灰度值图像,而对于RGB彩色摄像机,它将返回每个像素所对应的三个采样结果,也就是一幅三通道图像.下面这些是与图像通道有关的函数: ...
随机推荐
- Python3 函数基础1
目录 定义函数 定义函数的三种形式 空函数 有参函数 无参函数 函数的调用 函数的返回值 函数的参数 形参 (parameter) 实参(argument) 位置形参与位置实参 默认形参 关键字实参 ...
- 3年Java开发6个点搞定高并发系统面试疑惑
前言 其实所谓的高并发,如果你要理解这个问题呢,其实就得从高并发的根源出发,为啥会有高并发?为啥高并发就很牛逼? 说的浅显一点,很简单,就是因为刚开始系统都是连接数据库的,但是要知道数据库支撑到每秒并 ...
- CentOS7下设置网卡名称以eth开头
一.前言 在CentOS7下,网卡的名称不再是以eth命名了,下以内容将教你如何在CentOS7下修改网卡以"eth"开头. 二.环境 ♦CentOS7.5_x86-64 三.配置 ...
- Spring Cloud Alibaba 新一代微服务解决方案
本篇是「跟我学 Spring Cloud Alibaba」系列的第一篇, 每期文章会在公众号「架构进化论」进行首发更新,欢迎关注. 1.Spring Cloud Alibaba 是什么 Spring ...
- DataTable和DataReader的遍历
1.DataTable的遍历 //创建数据表 DataTable dt = GetDataTable("select * from Student"); //存储数据 String ...
- python 多线程编程之使用进程和全局解释器锁GIL
本文主要介绍如何在python中使用线程. 全局解释器锁: python代码的执行是由python虚拟机(又名解释器主循环)进行控制的.python中,主循环中同时只能有一个控制线程在执行,就像单核C ...
- Cesium 限制相机进入地下
有时我们在Cesium操作时,点击鼠标中间滚轮可更改视角,有时会使相机进入地下,导致体验很差,网上说了很多中方法,效果都不好或者没效果,下面是我翻了源码找到的方法,亲测有效.如有问题可按照专栏上的联系 ...
- Bash脚本编程之数组
数组简介 在bash脚本编程当中,变量是存储单个元素的内存空间:而数组是存储多个元素的一段连续的内存空间. 数组由数组名和下标构成,如下. ARRAY_NAME[SUBSCRIPT] 数组按照下标的类 ...
- leetcode菜鸡斗智斗勇系列(2)--- 把一个ipv4地址转换成一串数字
1.原题: https://leetcode.com/problems/defanging-an-ip-address/ 这道题本身很简单, Given a valid (IPv4) IP addre ...
- cpv framework 0.1 正式发布 (C++ 网页框架)
项目地址 https://github.com/cpv-project/cpv-framework 项目介绍 cpv framework 是一个 C++ 编写的网页框架,基于 seastar fram ...