OpenCV 编辑单个波段并重新合并

OpenCV edit single band and remerge

我有一张图像,我已将其分成三个独立的通道 (b、g、r)。我只想操纵红色波段,然后重新合并到蓝色和绿色波段以重新组合图像。但是,我的函数中一直出现 sig abort。 RBandSlider 指的是用于默认为 1 的轨迹栏的全局整数。几乎肯定问题出在 ImageEnhancement 函数中。

我是否需要将 redBandsAdjsuted 定义为其他内容,还是我没有抓取本地像素并正确重写?

Mat ImageEnhancement(Mat band){
Mat adjustedBand;
Scalar mean, std;
meanStdDev(band, mean , std);
int pixel,temp;
for(int i = 0; i < band.rows;i++){
    for(int j = 0; j < band.cols;j++){
        //extract pixel
        pixel = band.at<Vec3b>(i,j)[0];
        //pixel greater than mean
        if ( pixel > mean[0]){
            temp = (255);
            adjustedBand.at<Vec3b>(i,j) = temp;
        }
        else{
            temp = 0;
            adjustedBand.at<Vec3b>(i,j) = temp ;
        }
    }
}
return adjustedBand;
}


Mat Bands[3],merged,redBandsAdjusted(image.cols,image.rows,CV_8UC1),result;
split(image, Bands);

//loop the echancement adjustment
while(true){


    //adjust red band and merge
    redBandsAdjusted = ImageEnhancement(Bands[2]);
    vector<Mat> channels = {Bands[0],Bands[1],redBandsAdjusted};
    merge(channels,merged);

}

当你这样做时:

split(image, Bands);

您将从一张 CV_8UC3 张图片 (image) 中获得 3 CV_8U 张图片 (Bands)。到目前为止一切都很好。然后你去调整并犯了 2 个错误:

  1. Mat adjustedBand; 永远不会初始化...您可以执行 Mat adjustedBand(band.rows, band.cols, CV_8UC1); 或在稍后阶段初始化。

  2. pixel = band.at<Vec3b>(i,j)[0];adjustedBand.at<Vec3b>(i,j) = temp; 用于处理 3 个通道而不是 1 个通道的图像。您需要使用 uchar,例如:adjustedBand.at<uchar>(i,j) = temp;

这些是我看到的错误...修复它们并尝试使用调试器,这样您就知道某些东西是否正确初始化或是否执行正确操作