代码之家  ›  专栏  ›  技术社区  ›  C.Radford

opencv编辑单波段并重新合并

  •  0
  • C.Radford  · 技术社区  · 7 年前

    我有一个图像,我把它分成三个独立的通道(B,G,R)。我只想操纵红色波段,然后重新合并到蓝色和绿色波段,重新组合图像。不过,我的函数中一直有一个sig abort。这个 RBandSlider 指用于轨迹栏的全局int,默认为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);
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   C.Radford    7 年前

    当你这样做的时候:

    split(image, Bands);
    

    你将从一张简历图片中得到( image )3张简历图片( Bands )到现在为止一切都很好。然后进行调整并犯两个错误:

    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;

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