openCV颜色分离与合并操作

图片颜色通道分离函数:
CV_EXPORTS void split(const Mat& src, Mat* mvbegin);
第一个参数:输入集合的引用
第二个参数:输出的的集合
代码如下:

extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_splitMergePixels(JNIEnv *env, jclass type,
                                                                jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    //颜色数据转换 ARGB的颜色数据被转成BGRA
    Mat img(h,w,CV_8UC4,pixels);

    //颜色通道分离split
    vector<Mat> outImg;
    //颜色通道分离处理,就是把图像蓝色、绿色、红色单独分离增强,并改变图像的色态,
    split(img,outImg);
  //增强基色色值,并不改变图片的轮廓形态
    Mat& BMat = outImg.at(0);
  //被分离的颜色的数据指针
    uchar* b =  BMat.ptr(0);
    for(int i = 0;i < w*h;i++){
        ptr[4*i+0] = b[i];//改变蓝色
        ptr[4*i+1] = 0;
        ptr[4*i+2] = 0;
    }
    int size = w * h;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result,0,size,pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return result;
}

图像如下:


这里写图片描述

如何显示分离的绿色呢?

for(int i = 0;i < w*h;i++){
        ptr[4*i+0] = 0;
        ptr[4*i+1] = b[i];//改变绿色
        ptr[4*i+2] = 0;
    }

图像如下:


这里写图片描述
for(int i = 0;i < w*h;i++){
        ptr[4*i+0] = 0;
        ptr[4*i+1] = 0;
        ptr[4*i+2] = b[i];//改变红色
    }

如图所示


这里写图片描述

图片颜色合并函数:
CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);
第一个参数:需要合并的数组
第二个参数:矩阵的计数
第三个参数:输出数组
CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst);
第一个参数:需要合并的数组
第二个参数:输出数组
代码如下:

extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_splitMergePixels(JNIEnv *env, jclass type,
                                                                jintArray pixels_, jint w, jint h) {
    jint *pixels = env->GetIntArrayElements(pixels_, NULL);
    //颜色数据转换 ARGB的颜色数据被转成BGRA
    Mat img(h,w,CV_8UC4,pixels);
    //颜色通道分离split
    vector<Mat> outImg;
    //颜色通道分离处理,就是把图像蓝色、绿色、红色单独分离增强,并改变图像的形态,
    split(img,outImg);
    //颜色合并处理,颜色合并成功后,原始图片不会有任何的变化。
    merge(outImg,img);
    int size = w * h;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result,0,size,pixels);
    env->ReleaseIntArrayElements(pixels_, pixels, 0);
    return result;
}

图片合并成功后,原始图片不会有任何的变化。


这里写图片描述

本文章著作版权所属:微笑面对,请关注我的CSDN博客:博客地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Mat类是OpenCV中的一个非常重要的类,Mat类用于表示一个多维的单通道或者多通道的稠密数组。能够用来保存实数...
    一个三要不起阅读 12,929评论 0 1
  • 前言opencv在图像处理中使用广泛,许多常见的应用场景例如人脸识别,车牌识别等都是基于opencv开发的。本文是...
    肖丹晨阅读 10,474评论 0 4
  • 计算机视觉对我来说是一个全新的知识领域,希望能够逐步入门,从图像识别、人脸检测等问题的研究探讨逐步过渡到三维人脸重...
    HellyCla阅读 10,806评论 1 2
  • 第一件事:离散傅里叶变换( DFT ) 关于二维离散傅里叶变换的理论部分请移步我在简书的另一篇文章 《图像傅里叶...
    Code_r_Wang阅读 7,430评论 0 1
  • 我七点四十九就躺在床上 眼睛太疼半闭着 手机屏幕的光照的脸发绿 我庞大抱负一瞬间就朝着死 还是堕落的像个垃圾 目前...
    小橙君阅读 1,118评论 2 2