Opencv读取图像,图像通道分离,图像通道融合

这段代码实现了一个读取指定文件夹下所有.json和.bmp文件的功能,并将.json文件复制,.bmp文件进行颜色通道处理。对.bmp图像进行分割、合并,去除深度通道,然后保存处理后的图像,并显示在界面上。
摘要由CSDN通过智能技术生成
//
// Created by cynthia on 2021/11/25.
//
#include <sys/types.h>
#include <sys/stat.h>
#include "unistd.h"
#include "dirent.h"
#include <iostream>
#include <iostream>
#include <direct.h>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

//读入指定文件夹下的所有文件
void GetFileNames(string inpath, string outpath, vector<string>& infilenames, vector<string>& outfilenames)
{
    DIR *pDir;
    struct dirent* ptr;
    if(!(pDir = opendir(inpath.c_str())))
        return;
    while((ptr = readdir(pDir))!=0) {
        if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0)
        {
            infilenames.push_back(inpath + "/" + ptr->d_name);
            outfilenames.push_back(outpath+ "/" + ptr->d_name);
        }
    }
    closedir(pDir);
}

int main(int argc, char * argv[])
{
    std::string inPath="C:/Users/Seizet/Desktop/Data/Add_Down_2020_11_30_xukang";
    std::string outPath="C:/Users/Seizet/Desktop/Data/Add_Down_2020_11_30_TwoChannel";
    vector<string> inFiles;
    vector<string> outFiles;
    GetFileNames(inPath, outPath, inFiles, outFiles);


    if (0 != access(outPath.c_str(), 0))
     {
         if (0 != mkdir(outPath.c_str()))
         {
            return -1;
         }
     }
    for(int i = 0; i < inFiles.size(); i++)
    {
        string suffixStr = inFiles[i].substr(inFiles[i].find_last_of('.') + 1);       //获取文件后缀
        if(!suffixStr.compare("json"))                                             //字符串值相同返回0
        {
            CopyFile(inFiles[i].c_str(), outFiles[i].c_str(), FALSE);              //false代表覆盖,true不覆盖
        }
        if(!suffixStr.compare("bmp"))
        {
            cv::Mat srcImg = cv::imread(inFiles[i], cv::IMREAD_COLOR);
            std::vector<cv::Mat> splitImg;
            split(srcImg, splitImg);

            cv::Mat depthImg(srcImg.cols, srcImg.rows, CV_8UC1, cv::Scalar(0));
            splitImg[2] = Scalar(0);

            Mat dstImg;
            merge(splitImg, dstImg);
            cv::imwrite(outFiles[i], dstImg);

            cv::namedWindow("No depth Image", 0);
            cv::resizeWindow("No depth Image", cv::Size(960, 600));                 //创建窗口,自动大小
            cv::imshow("No depth Image", dstImg);                                   //显示图像到指定的窗口
            cv::waitKey(0);
        }
    }
    return 0;
}


以下是将HSI通道融合成RGB图像的Python代码: ```python import cv2 import numpy as np # 读取HSI图像 hsi_image = cv2.imread('hsi_image.jpg') # 将HSI图像转换为浮点型数据类型 hsi_image = hsi_image.astype(np.float32) / 255.0 # 分离HSI三个通道 h, s, i = cv2.split(cv2.cvtColor(hsi_image, cv2.COLOR_BGR2HSV)) # 对I通道进行归一化 i = cv2.normalize(i, None, 0, 1, cv2.NORM_MINMAX) # 计算RGB三个通道 r = np.zeros_like(i) g = np.zeros_like(i) b = np.zeros_like(i) for j in range(hsi_image.shape[0]): for k in range(hsi_image.shape[1]): if s[j, k] == 0: r[j, k] = i[j, k] g[j, k] = i[j, k] b[j, k] = i[j, k] else: h_temp = h[j, k] * 360 if h_temp == 360: h_temp = 0 c = 1 - abs(2 * i[j, k] - 1) * s[j, k] x = c * (1 - abs((h_temp / 60) % 2 - 1)) m = i[j, k] - c / 2 if h_temp < 60: r[j, k] = c + m g[j, k] = x + m b[j, k] = m elif h_temp < 120: r[j, k] = x + m g[j, k] = c + m b[j, k] = m elif h_temp < 180: r[j, k] = m g[j, k] = c + m b[j, k] = x + m elif h_temp < 240: r[j, k] = m g[j, k] = x + m b[j, k] = c + m elif h_temp < 300: r[j, k] = x + m g[j, k] = m b[j, k] = c + m else: r[j, k] = c + m g[j, k] = m b[j, k] = x + m # 合并RGB三个通道 rgb_image = cv2.merge([b, g, r]) # 将RGB图像转换为8位数据类型并保存 rgb_image = (rgb_image * 255).astype(np.uint8) cv2.imwrite('rgb_image.jpg', rgb_image) ``` 该代码将读取一张HSI图像,并使用opencv库实现了将HSI通道融合成RGB图像的过程,最终将生成的RGB图像保存到本地。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cynthia.Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值