gpt4 book ai didi

ios - 如何去除偏色或调整白平衡?

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:47 24 4
gpt4 key购买 nike

总结:

特别是在 iPhone 7 上进行测试时,我一直在校正图像的白平衡和色偏方面遇到问题。到目前为止,iPhone 6 上的一切都运行良好,但 7 上的相机有时会产生紫色、黄色或蓝色色调在闪光灯打开的任何图像中。我正在开发的应用程序在很大程度上依赖于使用 OpenCV 进行颜色检测,因此我正在尝试不同的方法来校正偏色。我遇到的场景是这样的:用户有一张纸和纸上的一些项目可以通过颜色识别,但是当 iPhone 7 靠近纸使用时,整个图像上的闪光灯都带有色调.该纸用于更轻松地将图像与背景分开,并用于白平衡以了解图像的哪一部分应该是白色的,以潜在地解决白平衡/偏色问题。

详细信息:

我可以使用 OpenCV 的背景调整方法来校正颜色的轻微色调:

- (void)adjustBackground:(Mat &)inputROI image:(Mat &)imageInBG{

Scalar meanCol = mean(inputROI);

// original
Mat labOrig, labFloat, ROIfloat;
std::vector<Mat>planes(3);
inputROI.convertTo(ROIfloat, CV_32FC3, 1.0/255.0f);
cvtColor(ROIfloat,labFloat,CV_BGR2Lab);
split(labFloat,planes);


double l_v,a_v,b_v;
rgb2lab(meanCol(2), meanCol(1), meanCol(0), l_v, a_v, b_v);

add(planes[1], -a_v, planes[1]);
add(planes[2], -b_v, planes[2]);

merge(planes,labFloat);
cvtColor(labFloat, ROIfloat, CV_Lab2BGR);
ROIfloat.convertTo(inputROI , CV_8UC3, 255.0f);

planes.clear();
labOrig.release();
labFloat.release();
ROIfloat.release();
}

rgb2lab 的作用正是它所暗示的,将 rgb 转换为 lab 颜色空间。我还将图像转换为 float 以获得更好的精度。这能够纠正小的色偏,但如果图像着色很重,它仍然会导致轻微着色的颜色,并且使用 OpenCV 进行颜色检测仍然会导致检测到过多的着色颜色。

我接下来尝试的更多是直接调整相机设置,我认为这是一种更好的方法来最初解决问题,而不是事后进行某种后期处理色彩校正。我找到了一些修改相机温度和色调值的文档,但这只会导致用户必须手动调整 slider 以获得所需的白平衡图像:

Class captureDeviceClass = NSClassFromString(@"AVCaptureDevice");
if (captureDeviceClass != nil) {
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if ([device isWhiteBalanceModeSupported: AVCaptureWhiteBalanceModeLocked]){
if ([device lockForConfiguration:nil]){
AVCaptureWhiteBalanceTemperatureAndTintValues temperatureAndTint = {
.temperature = tempVal,
.tint = tintVal,
};

AVCaptureWhiteBalanceGains wbGains = [device deviceWhiteBalanceGainsForTemperatureAndTintValues:temperatureAndTint];

if((NSLocationInRange(wbGains.redGain, NSMakeRange(1, (device.maxWhiteBalanceGain - 1.0))))&&(NSLocationInRange(wbGains.greenGain, NSMakeRange(1, (device.maxWhiteBalanceGain - 1.0))))&&(NSLocationInRange(wbGains.blueGain, NSMakeRange(1, (device.maxWhiteBalanceGain - 1.0)))))
{
NSLog(@"Good values");
[device deviceWhiteBalanceGainsForTemperatureAndTintValues:temperatureAndTint];

[device setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:[device deviceWhiteBalanceGainsForTemperatureAndTintValues:temperatureAndTint] completionHandler:^(CMTime syncTime) {

}];
[device unlockForConfiguration];
}
else{
NSLog(@"Bad values");
}
}
}

其中 tempVal 和 tintVal 是 slider 的输入。

有什么方法可以关闭 iPhone 相机的自动调整功能,或者 OpenCV 中有没有更好的方法来调整更极端的色偏?

编辑:

这里有一些例子。忽略中间的图表,我正在尝试使用直方图。一幅图像显示整个图像呈蓝色调,另一幅图像显示我的偏色校正在中间的 ROI 中起作用,但它改变了图像上的颜色太多(我需要电阻器上的色带与尽可能准确)。

http://i.imgur.com/jlc4MDa.jpghttp://i.imgur.com/PG81pAl.jpg

最佳答案

对于任何这可能有所帮助的人,我找到了一个不错的解决方案来调整偏色。事实证明,我最初使用 OpenCV 进行调整的方式非常接近,我只需要调整我正在寻找的颜色范围,使其与调整后得到的颜色相似。我也停止使用我发现的 rgb2lab 函数,直接将垫子本身从 bgr(精确 float )转换为 lab。这看起来更接近于真正的白平衡或色彩校正图像,但它可能只是我提出的调整后的色彩范围才真正让它变得更好。

其余部分几乎相同,只需找到 A 和 B channel 的平均值并将垫子分成 LAB 平面以将它们调整为“回到中心”。以下是使用 float LAB 垫并获取 A 和 B 中的偏移量的代码:

Mat labFloat, ROIfloat;
std::vector<Mat>lab_planes(3);
input.convertTo(ROIfloat, CV_32FC3, 1.0/255.0f);
cvtColor(ROIfloat,labFloat,CV_BGR2Lab);
split(labFloat,lab_planes);

Scalar meanVals = mean(labFloat);

// valA is the mean of the A channel (offset to add/subtract)
// valB is the mean of the B channel (offset to add/subtract)
double valA = meanVals(1);
double valB = meanVals(2);

编辑:我只想补充一点,我也只开始了我需要的偏色校正点区域而不是整个图像。图像的不同区域根据光照等有不同的转换,因此一次只使用小区域进行校正是有意义的。事实证明,这更加准确,并提供了更好的结果。

关于ios - 如何去除偏色或调整白平衡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45787176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com