精华内容
下载资源
问答
  • 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 表示纵坐标

    展开全文
  • 前言 在机器学习和深度学习的,对图像进行处理时,会遇到明明是给的三通道的图像,但因为是黑白的,程序判断为...为了使用处理好的单通道Mat,可以写个函数把单通道Mat强行转换成三通道的Mat. Mat channelSwitching...

    前言

    在机器学习和深度学习的时候,对图像进行处理时,会遇到明明是给的三通道的图像,但因为是黑白的,程序判断为单通道的图像,这样让人很无语,还有有时候有些库必须要传入三通道的RGB图像,但为了提升处理的速度,我们就已经在别的地方做比如边缘检测啊,外部轮廓提取等操作,此时的图像已经是单通道Mat,为了使用处理好的单通道Mat,可以写个函数把单通道的Mat强行转换成三通道的Mat。

    Mat类型转换

    Mat channelSwitching(const Mat& src)
    {
        Mat three_channel = Mat::zeros(src.rows,src.cols,CV_8UC3);
        vector<Mat> channels;
        if(src.channels() == 0)
        {
            for (int i=0;i<3;i++)
            {
                channels.push_back(src);
            }
            merge(&channels[0], channels.size(), three_channel);
        }
        
       return three_channel; 
    }
    

    转换的结果也是得到一张黑白图像,但此时已经是三通道的黑白图像了,意思就是把程序给骗过去而已。

    展开全文
  • 分析:三通道的彩色图像就是R,G,B三个通道,那么将我的单通道黑白复制三份merge一下,不就是一张三通道图像了嘛,只不过有颜色只有黑白,实验了一下果然可以用了。 废话不多说,上代码: /********************...

    原文链接

    在项目中遇到一个问题,调用别人编好的库需要传入三通道的彩色图像。但是我的图像经过处理后已经是二值化的图像了,所以得想想办法了。 
    分析:三通道的彩色图像就是R,G,B三个通道,那么将我的单通道黑白图复制三份merge一下,不就是一张三通道图像了嘛,只不过有颜色只有黑白,实验了一下果然可以用了。 
    废话不多说,上代码:
     

    /*************************************************
    //  Method:    convertTo3Channels
    //  Description: 将单通道图像转为三通道图像
    //  Returns:   cv::Mat 
    //  Parameter: binImg 单通道图像对象
    *************************************************/
    Mat convertTo3Channels(const Mat& binImg)
    {
        Mat three_channel = Mat::zeros(binImg.rows,binImg.cols,CV_8UC3);
        vector<Mat> channels;
        for (int i=0;i<3;i++)
        {
            channels.push_back(binImg);
        }
        merge(channels,three_channel);
        return three_channel;
    }

     

    展开全文
  • // set all mat values at given channel to given value void setChannel(Mat &mat, unsigned int channel, unsigned char value) { // make sure have enough channels if (mat.channels() < channel + 1...

    方法3 

    也可以先split 通道,赋值后再merge各个通道,比较消耗时间和内存

    方法4 

    使用mat数组   mat[N], 然后单独对每个通道元素赋值

    方法 1 - 更高效

    // set all mat values at given channel to given value
    void setChannel(Mat &mat, unsigned int channel, unsigned char value)
    {
        // make sure have enough channels
        if (mat.channels() < channel + 1)
            return;
    
        const int cols = mat.cols;
        const int step = mat.channels();
        const int rows = mat.rows;
        for (int y = 0; y < rows; y++) {
            // get pointer to the first byte to be changed in this row
            unsigned char *p_row = mat.ptr(y) + channel; 
            unsigned char *row_end = p_row + cols*step;
            for (; p_row != row_end; p_row += step)
                *p_row = value;
        }
    }

    方法 2 - 更优雅

    // set all mat values at given channel to given value
    void setChannel(Mat &mat, unsigned int channel, unsigned char value)
    {
        // make sure have enough channels
        if (mat.channels() < channel+1)
            return;
    
        // check mat is continuous or not
        if (mat.isContinuous())
            mat.reshape(1, mat.rows*mat.cols).col(channel).setTo(Scalar(value));
        else{
            for (int i = 0; i < mat.rows; i++)
                mat.row(i).reshape(1, mat.cols).col(channel).setTo(Scalar(value));
        }
    }

    P.S.:值得注意的是,根据文档,用 Mat::create() 创建的矩阵总是连续的。但是,如果您使用 Mat::col()、Mat::diag() 等提取矩阵的一部分,或者为外部分配的数据构造矩阵头,则此类矩阵可能不再具有此属性。

    展开全文
  • 分析:三通道的彩色图像就是R,G,B三个通道,那么将我的单通道黑白复制三份merge一下,不就是一张三通道图像了嘛,只不过有颜色只有黑白,实验了一下果然可以用了。 代码实现: /********************************...
  • cv::Mat三通道与单通道互相转换

    万次阅读 2016-09-18 16:45:16
    三通道与单通道图像相互转换。
  • 方法1:利用“ Mat.at<存储类型>(行,列) ”访问Mat矩阵元素并赋值 int main() { Mat img = Mat::zeros(Size(10000, 10000), CV_64FC1); DWORD startTime = GetTickCount(); for (int i = 0; i < 10000; ...
  • 使用OpenCV将RGB转换为单通道

    万次阅读 2018-07-26 14:20:38
    环境 项目 参数 OS Windows 10 Professional amd x64 IDE Visual Studio 2017 Professional ...首先使用cvLoadImage函数将图片读入到一个IplImage中。 /* load image from file iscol...
  • % 第一:读取avi格式视频,并转换成mat格式; % 第二:单通道图像提取 彩色图像,三通道单独存储; % 第三:mat 修改图像尺寸 % 第四: 将图片序列转化为视频文件 % 第五:mat文件转avi视频文件
  • import org.bytedeco.javacpp.opencv_core.Mat; import org.bytedeco.javacpp.opencv_core.Scalar; import org.bytedeco.javacpp.opencv_core.Size; import static org.bytedeco.javacpp.opencv_cor.
  • 分析:三通道的彩色图像就是R,G,B三个通道,那么将我的单通道黑白复制三份merge一下,不就是一张三通道图像了嘛,只不过有颜色只有黑白,实验了一下果然可以用了。 废话不多说,上代码: ...
  • 需求:图像是8位,单通道图像,想把图像用jpeg格式保持下来。假定图像宽640,高400 通过Mat中遍历方式,来将文件中读取的8位存储到Mat中。(不用imread读取,因为还有16位单通道图像,我现在暂时只了解这个方式可以...
  • 在处理图像的过程中,我们经常需要将图像进行通道分离,目的是获取某通道特有...官方文档地址使用方法:b,g,r=cv2.split(RGB_Image)与之相对应的将单通道进行融合我们需要cv2.merge([R,G,B])函数import cv2import ma...
  • cv::Mat m1=(cv::Mat_<int>(3,2)<<1,2,3,4,5,6); cv::Mat m2=(cv::Mat_<int>(3,2)<<2,4,6,8,10,12); cv::Mat m3=(cv::Mat_<int>(3,2)<<3,6,9,12,15,18); //方法1 cv::Mat ...
  • mat像素的数据类型参考于:https://blog.csdn.net/qq_29540745/article/details/52517269 opencv的图像像素点遍历参考于:https://blog.csdn.net/daoqinglin/article/details/23628125
  • #include "pch.h" #include &lt;iostream&gt; #include &...opencv2/opencv.hpp&... Mat m = (Mat_&lt;int&gt;(3, 2) &lt;&lt; 11, 12, 33, 43, 51, 16)...
  • 学习OpenCV2——Mat通道的理解

    千次阅读 2018-10-13 14:11:28
    本文详细介绍了opencv中涉及通道的知识,包括图像类型转换,通道合成分解,图像的显示。   转载来自:http://lib.csdn.net/article/opencv/33264 1. 知识点 tips1: 一个图像的通道数是N,就表明每个像素点处有...
  • 将多通道数组分割成多个单通道数组: C++ CV_EXPORTS void split(const Mat& src, Mat* mvbegin) C++ void split(InputArray m, OutputArrayOfArrays mv) Python: cv2.split(m[, mv]) 参数: src:多通道数组 ...
  • 问题:单通道读取后,以灰度方式显示了,但是无法绘制,比如下,中心黑色矩形框为绘制矩形,若在单通道中无法绘制。 描述: 单通道读取方法: image = cv.imread(pic_path) image = image[:,:,0] # ...
  • //http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_mat.html cv::Mat img1 = cv::imread(bmpfile,0); cv::Mat img2; img1.convertTo(img2,CV_8U); for (int i = 0 ; i ;
  • OpenCV Mat图像的像素值读写

    千次阅读 2021-11-03 21:36:43
    数组赋值给gray的Mat2.RGB图像复制给RGB的Mat3.Gray图像复制给RGB的Mat4.Gray图像复制给gray的Mat新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片...
  • 如题啊,opencv读取灰度图单通道图像时候,读取进来的是三通道, 原因在于opencv对于省缺图册进行复制, 因此读取的三通道。之前一直没有注意,不过针对这种情况, 可以选择在读入imread时候,路径后面参数置为0,再...
  • 通道:#include &lt;opencv2/opencv.hpp&gt;#include&lt;vector&gt;#include &lt;fstream&gt;using namespace std;using namespace cv;int main(int argc, char* argv[]){ const char* ...
  • 问题背景:一张未知图片,opencv读取进来,有几种情况都要分析 3通道----彩色:(123,146,78)(147,25,36) 3通道----灰度:(123,123,123)(45,45,45) 3通道----二值:(0,0,0)(255,255,255) 1通道----...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,383
精华内容 6,153
关键字:

mat单通道图