OpenCV редактировать одну полосу и заново - PullRequest
0 голосов
/ 06 июня 2018

У меня есть изображение, которое я разделил на три отдельных канала (b, g, r).Я хочу манипулировать только красной полосой, а затем вернуться к синей и зеленой полосе, чтобы изменить композицию изображения.Однако я продолжаю прерывать свою работу.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 Ответ

0 голосов
/ 07 июня 2018

Когда вы делаете:

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;

Это ошибки, которые я вижу ... исправьте их и попробуйте использовать отладчик, чтобы вы знали, если что-топравильно инициализировать или если он выполняет правильную операцию

...