精华内容
下载资源
问答
  • opencv mat 单通道图像获取 像素值

    千次阅读 2017-09-22 16:02:31
    Mat binary_img; 方法一:  mat at 函数获取 pixel_val = binary_img.at(i,j); 方法二 通过指针获取 pixel_val = (int)(*(binary_img.data + (int)(binary_img.rows * j) +  (int)j); 方法三: ...

    Mat binary_img;

    方法一: 

    mat  at 函数获取

    pixel_val = binary_img.at<uchar>(i,j);


    方法二

    通过指针获取

    pixel_val = (int)(*(binary_img.data + (int)(binary_img.rows * j) + 

    (int)j);


    方法三:

    uchar* p;
    p = binary_img.ptr<uchar>(i);

    pixel_val = (int)p[j];


    i 表示 横坐标, j 表示纵坐标

    展开全文
  • sobel边缘检测 素描风 三通道图片上叠加单通道图片方法

    惯例效果图震楼



    感觉物体比人看上去好看多了。。。摔!!


    惯例opencv配置环境地址:http://blog.csdn.net/zmdsjtu/article/details/52235056



    实现代码如下:

    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/imgproc/imgproc.hpp>  
    #include <opencv2/core/core.hpp>  
    using namespace cv;
    void sumiao(Mat &image);
    int main() {
    	VideoCapture cap(0);
    	Mat frame;
    	while (waitKey(30) != 27)
    	{
    		cap >> frame;
    		sumiao(frame);
    
    	}
    }
    void sumiao(Mat &image) {
    	
    
    	Mat image2 = image.clone();
    	cvtColor(image, image, CV_BGR2GRAY);//灰度图
    	Mat sobel_x, sobel_y;
    	Sobel(image, sobel_x, CV_16S, 1, 0);  // Sobel
    	Sobel(image, sobel_y, CV_16S, 0, 1);
    	Mat sobel;
    	sobel = abs(sobel_x) + abs(sobel_y);
    
    	double sobmin, sobmax;
    	minMaxLoc(sobel, &sobmin, &sobmax);
    	Mat sobelImage;
    	sobel.convertTo(sobelImage, CV_8U, -255.0 / sobmax, 255);   
    
    	int 倍数 = 2;
    	cv::resize(sobelImage, sobelImage, Size(640/倍数, 480/倍数));
    	
    	for (int i = 0; i < sobelImage.rows; ++i) {
    		for (int j = 0; j < sobelImage.cols; ++j) {
    			image2.data[3*(j + i*image2.cols+image2.cols-sobelImage.cols)] = sobelImage.data[j + i*sobelImage.cols];
    			image2.data[3 * (j + i*image2.cols + image2.cols - sobelImage.cols)+1] = sobelImage.data[j + i*sobelImage.cols];
    			image2.data[3 * (j + i*image2.cols + image2.cols - sobelImage.cols)+2] = sobelImage.data[j + i*sobelImage.cols];
    		}
    
    	}
    
    	imshow("素描图", image2);
    
    }
    


    最后显示图片的时候在三通道的彩色图上叠加了单通道的灰度图,代码如下:

    			image2.data[3*(j + i*image2.cols+image2.cols-sobelImage.cols)] = sobelImage.data[j + i*sobelImage.cols];
    			image2.data[3 * (j + i*image2.cols + image2.cols - sobelImage.cols)+1] = sobelImage.data[j + i*sobelImage.cols];
    			image2.data[3 * (j + i*image2.cols + image2.cols - sobelImage.cols)+2] = sobelImage.data[j + i*sobelImage.cols];

    三通道对应像素点直接都赋值为单通道的值就好






    最后祝大家opencv使用愉快~

    展开全文
  • cv::Mat三通道与单通道互相转换

    万次阅读 2016-09-18 16:45:16
    三通道与单通道图像相互转换。

    在处理图像的过程中,经常用到三通道与单通道图像相互转换。

    先需要知道:OpenCV中存储三通道图像具体数据的方式是BGR BGR BGR………


    具体实现:

        cv::Mat SrcMat = cv::imread("1.jpg",1);                           // 1.jpg为三通道图像

        std::vector<cv::Mat>SrcMatpart(SrcMat.channels());      //生成与通道数数目相等的图像容器

        cv::split(SrcMat,SrcMatpart);                                          //解与通道数数目相等的图像容器

        cv::Mat MergeMat;

        cv::merge(SrcMatpart,MergeMat);                                //成与通道数数目相等的图像容器


    详细分析, SrcMat被分为SrcMatpart[0]、 SrcMatpart[1]、SrcMatpart[2]三部分。

    SrcMatpart[0]存储B颜色分量,SrcMatpart[1]存储G颜色分量,SrcMatpart[2] 存储R颜色分量。

    MergeMat为合成后BGR分量后的图片。

     

    SrcMat数据:53 1d 3b 58 20 3d 5c 22 3f 5f 24 40 61 27 40 61 27 40 5d 27 3e 5e 283f 5d 26 3f 5e 27 40 5d 26 41 5c 25 40 5f 28 43 60 29 42

    SrcMatpart[0]:53 58 5c 5f 61 61 5d 5e 5d 5e 5d 5c 5f 60……….

    SrcMatpart[1]:1d 20 22 24 27 27 27 28 26 27 26 25 28 29…………..

    SrcMatpart[2]:3b 3d 3f 40 40 40 3e 3f 3f 40 41 40 43 42 …………..

    MergeMat数据: 53 1d 3b 58 20 3d 5c 22 3f 5f 24 40 61 27 40 61 27 40 5d 27 3e 5e28 3f 5d 26 3f 5e 27 40 5d 26 41 5c 25 40 5f 28 43 60 29 42

     

    对彩色图像来说,三通道中数据不同,分别表示颜色分量。对黑白图像来说,三个通道数据完全相同。

    建议不再使用IplImage结构类型描述图像。


    展开全文
  • 单通道灰度数据存放样式:RGB三通道彩色存放形式不同,每列并列存放通道数量的子列(注意通道数量反转为了BGR):通常情况下Mat的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,在用指针访问时...

    1.Mat是什么

    Mat是一种图像容器,是二维向量,灰度图的Mat一般存放<uchar>类型,RGB彩色图像一般存放<Vec3b>类型。

    单通道灰度图数据存放样式:

    v2-0efa9bf051295f79699671a2017f5a38_b.jpg

    RGB三通道彩色图存放形式不同,每列并列存放通道数量的子列(注意通道数量反转为了BGR):

    v2-60cc005b89290828e6bb60ae2bff83a7_b.png

    通常情况下Mat的每一行是连续存放的,也就是在内存上图像的所有数据存放成一行,在用指针访问时可以提供很大方便。可以用 isContinuous()函数来判断图像数组是否为连续的,语句为

    if (img.isContinuous()){}

    2.如何创建Mat对象

    Mat到底有哪些参数呢,OpenCV官方文档对Mat的描述如下:

    class 

    当我们用构造函数创建一个Mat对象的时候,可以指定图像的数据类型有CV_8UC1、CV_8UC3、CV_32FC1、CV_32FC3等多种形式,如定义

    Mat img(480, 640, CV_16UC1);

    就是创建一个640*480的16位深的单通道Mat对象。CV_8UC3自然就是最常见的8位3通道图(即255的RGB图像)。

    当然最常用的是用opencv读入一张本地图像,此时自动就是一个Mat对象,但有时我们需要像python里的numpy那样方便地转换Mat对象的数据类型,numpy里可以这样操作

    img

    在C++的opencv里,就是这样转为16位的无符号整数三通道的:

    using 

    Mat也可以通过深拷贝创建一个新地址的Mat,避免影响原始的Mat:

    Mat copy;
    image.copyTo(copy);

    除此之外,python的numpy里经常采用如下的方式构建全1的矩阵:

    import 

    那么c++里如何构建这样的Mat呢?

    Mat 

    这样就创建了一个全为1的矩阵了(类似的可以zeros等等是一样的创建方法)。

    有时我们对图像进行一些像素值的缩放,也就是对某个图像进行全部元素的加减乘除,python里自然非常方便,如所有元素除以100,那么image / 100.0即可。c++里使用convertTo非常容易实现这点(不必for循环了)。

    如果我们要对矩阵A进行元素的加减乘除操作得到B,即B=a*A+b,则

    A

    举个例子,刚刚提到的全部元素除以100那就是

    A.convertTo(B,CV_32F,0.01,0.00);

    3.Mat对象如何访问元素

    从Mat的类定义看,用data可以方便访问图像元素值。用Mat存储一幅图像时,若图像在内存中是连续存储的(即Mat对象的isContinuous == true),则可将图像的数据看成是一个一维数组,而其data(uchar*)成员就是指向图像数据的第一个字节的指针,因此可以用data指针访问图像数据,OpenCV中将data定义为uchar*类型。那么我们如何通过data指针去访问和修改图像的某一个像素值呢,对于数据为uchar类型的Mat对象,可以直接用data访问和修改,对于其他类型的Mat对象,将data强制转换成指向Mat对象对应数据类型的指针即可访问。

    可以把Mat对象方便地转为一维指针数组,便于指针操作(指针访问数组进行操作速度更快):

    unsigned short* Array = (unsigned short*)Data.data;
    delete[] Array;

    也可借用opencv里Mat类的智能指针,这样即可auto data = Data.ptr();

    对这个数组进行了一系列图像处理操作后,如果要保存回Mat便于后续imshow和imwrite,保存方式可以这样:

    Mat newData(480, 640, CV_16UC3, Array);

    当然这样是灵活的提供了自己创的指针,用了后还需要delete,为了方便可以用Mat自带的智能指针进行操作。

    这里举一个实例:如果我们只对像素值小于0.1的像素才执行膨胀操作(也就是为了填充0),python里搞一个mask就可以轻易实现

    empty_pixels 

    在c++里则不然,用智能指针可以这样操作:(构建行智能指针数组)

    Mat 

    这样使用智能指针也可以(这样可以操作每个元素了)

     for (int k = 0; k < 480; k++)
        {
          for (int q = 0; q < 640; q++)
            {
               auto *ptr = depthArray.ptr<uint16_t>(k, q);
               if (ptr[0] ==0)
                {
                 ptr[0] = 10;
                }
            }
        }

    补充小tip:

    记录一下常用的程序计时方法(和python里的time一样方便):

    clock_t 

    这里记录一个好用的numpy的操作:numpy.where

    np.where(condition, x, y)当满足condition时用x代替y,如

    src

    意思就是把小的像素值全都变为nan

    另外,这里的condition也可以是布尔数组,每个条件都和x,y相对应(广播机制),x遇到False时由y给x对应位置的像素值。如

    mask 
    展开全文
  • % 第一:读取avi格式视频,并转换成mat格式; % 第二:单通道图像提取 彩色图像,三通道单独存储; % 第三:mat 修改图像尺寸 % 第四: 将图片序列转化为视频文件 % 第五:mat文件转avi视频文件
  • /************************************************* ...// Description: 将单通道图像转为三通道图像 // Returns: cv::Mat // Parameter: binImg 单通道图像对象 ******************************...
  • 分析:三通道的彩色图像就是R,G,B三个通道,那么将我的单通道黑白复制三份merge一下,不就是一张三通道图像了嘛,只不过有颜色只有黑白,实验了一下果然可以用了。 废话不多说,上代码: ...
  • 分析:三通道的彩色图像就是R,G,B三个通道,那么将我的单通道黑白复制三份merge一下,不就是一张三通道图像了嘛,只不过有颜色只有黑白,实验了一下果然可以用了。 废话不多说,上代码: /********************...
  • cout3 输出构造的mat数据 3是上面代码输出的结果,a是单通道,b是三通道,所以b是3行9列。里面的具体的值是opencv随机自动给的,因为我们还没有对mat赋值,这个不用管。再来看几个操作, Mat mz = Mat::zeros...
  • 前言 在机器学习和深度学习的,对图像进行处理时,会遇到明明是给的三通道的图像,但因为是黑白的,程序判断为...为了使用处理好的单通道Mat,可以写个函数把单通道Mat强行转换成三通道的Mat. Mat channelSwitching...
  • OpenCV 单通道图像

    千次阅读 2018-01-12 18:44:39
    #include"OpenCVLib2.hpp" using namespace cv; int main(){ vector channels; Mat imgBlueChannel; Mat imgGreenChannel;... Mat imgRedChannel;... //OpenCV的通道是BGR 不是 RGB,顺序要注意 Mat srcImg
  • opencv 单通道图像合成三通道RGB时,图片显示(也保存过)不全,感觉宽度上拉伸,虽然图片尺寸一致,但只显示了原1/3 ``` cv::Mat bandCombine(cv::Mat& red, cv::Mat& green, cv::Mat& blue) { ...
  • #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> ... Mat srcImage;//原图像 Mat srcImage1;//原图像 Mat logoImage;.
  • 首先解释下什么是多通道图像,一个普通的彩色图像的每个像素点是由RGB三种颜色构成的,那么这种图像就是3通道图像,其中单独的R色、G色和B色都分别称为一个单通道图像。opencv中的Mat类型实际上可以理解为一种多维多...
  • 程序功能:提取单通道图像轮廓 #include <opencv.hpp> #include <iostream> #include <vector> using namespace cv; using namespace std; int main() { Mat SrcImage = imread("1.png"); ...
  • 需求:图像是8位,单通道图像,想把图像用jpeg格式保持下来。假定图像宽640,高400 通过Mat中遍历方式,来将文件中读取的8位存储到Mat中。(不用imread读取,因为还有16位单通道图像,我现在暂时只了解这个方式可以...
  • Mat temp; resize(img, temp, Size(rect.Width(), rect.Height())); MatToCImage(temp, imgae); pDc->SetStretchBltMode(COLORONCOLOR); imgae.Draw(pDc->m_hDC, 0, 0, rect.Width(), rect.Height(), 0, 0,...
  • 如题,即8位深度的Tga格式图片,在简书找到一篇读入32位或24位的 https://www.jianshu.com/p/21fcd8398799 或者有大佬提示下改写的要点在哪?不太懂这些格式
  • opencv 图像单通道 多通道理解channels

    千次阅读 2017-07-09 16:33:44
    单通道: 此通道上值为0-255。 (255为白色,0是黑色) 只能表示灰度,不能表示彩色。  三通道:在BGR (255,255,255为白色, 0,0,0是黑色 ) 可以表示彩色, 灰度也是彩色的一种。 cv::imread函数。 ...
  • <div><p>输入图像为单通道,设置input_cvt_param的scale为1.0和bias为0.0,scale和bias的设置方式试了多种(4个值,3个值,1个值) 加上: instance->SetInputMat(image_mat, input_cvt_...
  • 单通道图像反差处理 //读取图像像素,获取反差 Mat gray; cvtColor(src, gray, CV_BGR2GRAY); int height, width; height = gray.rows; width = gray.cols; for (int row = 0; row < height; row++) { ...
  • 一、Mat初始化 1.使用Mat构造函数 //方法一: Mat M( 2, 2, CV_8UC3, Scalar(0,255,0) );//其实是2*6的矩阵,因为每个元素有3...//单通道 //方法二: int sz[3] = {2, 2, 2}; Mat L( 3, sz, CV_8UC(1), Scalar::all(...
  • #include&lt;opencv2/opencv.hpp&gt; #include&lt;iostream&gt; #include&lt;math.h&gt; using namespace std; using namespace cv;... Mat src,dst,gray_src; src = imread("D:/te...
  • #include &lt;iostream&gt; #include "opencv2/opencv.hpp" using namespace std;... //读入图像,并将之转为单通道图像 Mat im = imread("lena.jpg"); namedWin...
  • 看课程自己做的笔记,防丢失放到个人空间的)第1课-加载、修改、保存图像加载图像(cv::imread)修改图像(cv::cvtColor)保存图像(cv::imwrite)代码演示1-加载图像imread功能时加载图像文件成为一个Mat对象,其中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 506
精华内容 202
关键字:

mat单通道图