- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
总结:
特别是在 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.jpg和 http://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/
我是一名优秀的程序员,十分优秀!