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 个错误:
Mat adjustedBand;
永远不会初始化...您可以执行 Mat adjustedBand(band.rows, band.cols, CV_8UC1);
或在稍后阶段初始化。
pixel = band.at<Vec3b>(i,j)[0];
和 adjustedBand.at<Vec3b>(i,j) = temp;
用于处理 3 个通道而不是 1 个通道的图像。您需要使用 uchar
,例如:adjustedBand.at<uchar>(i,j) = temp;
这些是我看到的错误...修复它们并尝试使用调试器,这样您就知道某些东西是否正确初始化或是否执行正确操作
我有一张图像,我已将其分成三个独立的通道 (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 个错误:
Mat adjustedBand;
永远不会初始化...您可以执行Mat adjustedBand(band.rows, band.cols, CV_8UC1);
或在稍后阶段初始化。pixel = band.at<Vec3b>(i,j)[0];
和adjustedBand.at<Vec3b>(i,j) = temp;
用于处理 3 个通道而不是 1 个通道的图像。您需要使用uchar
,例如:adjustedBand.at<uchar>(i,j) = temp;
这些是我看到的错误...修复它们并尝试使用调试器,这样您就知道某些东西是否正确初始化或是否执行正确操作