- 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/
给定一个字符串"5 900 000" 我想通过以下模式使用 gsub 去除空格: gsub(/\s/, '') 但这似乎行不通。也没有: gsub(' ', '') 最佳答案 如果你想就地替换,你需要
我编写了一个程序来抓取网站以获取数据并输出到 Excel 表。该程序使用 Microsoft Visual Studio 2010 用 C# 编写。 大多数时候,我从网站获取内容、解析内容并将数据存储
在 MS Access 2007 项目报告中,我有以下(已编辑)查询: SELECT SomeCol FROM SomeTable 问题是, SomeCol 显然包含一些不可见的字符。例如,我看到一个
如 Removing left recursion 中所述,有两种方法可以去除左递归。 使用一些过程修改原始语法以删除左递归 写文法原来没有左递归 人们通常使用什么来删除(没有)ANTLR 的左递归?
我在 CoreData 中存储了一堆艺术家,并希望按名称对它们进行排序,但忽略前缀“the”。例如,“The Beatles”将被排序为“Beatles”,有点像 iTunes/iPod 的做法。 因
我有一个 WebView ,我想从中删除弹性。现在,当滚动小于 webview 的页面时,它会产生弹性效果,显示下面的背景。我想删除这个。 我尝试过执行以下操作,但没有成功。它找到了 WebDynam
我正在调查我们公司使用 Prometheus 从我们在 Kubernetes 上运行的实验中收集统计数据。有计划使用标签来标记我们的云/集群中特定实验的名称。这意味着我们将生成大量标签,这些标签会随着
我正在添加聚合物元素。我想在单击其(自己的)图像时删除元素(自我)。根据封装,我将不得不让 parent 删除 child 。但这也需要为母体生成聚合物元素(我在这里吗??)。 children.ad
现在如果我点击按钮 A,按钮 B 会显示 DropShadow 效果: Private Sub ButtonA_Click(ByVal sender As System.Object, ByVal
我尝试过这个,但它对我不起作用: char * remove_nl(char * newstr) { newstr = strdup(newstr); newstr[strlen(ne
我陷入了两难境地。我有一个图像,我想占据网页的背景。我希望它横跨屏幕的宽度和高度,并保持那个尺寸。当我使用 标签,我不知道如何将它拉伸(stretch)到没有白条的屏幕上。 wspace 和 hspa
Jade .foo .foo 结果 想要的结果 在 haml 中我会做类似 .foo>< 的事情但这在 Jade 中不起作用。我已经搜索并空手而归如何处理这个问题。我如何达到预期的结果
我是 Maven 的新手,当我尝试将我当前的项目从使用 Ant 转换为 -> 使用 Maven 时遇到了问题。 那个项目需要很多 Jar,我在 mvnrepository 上查找这些 jar 并将它们
我需要一个正则表达式来删除 xml 标记开头和结尾之间的空格。例如:有人创建 xml 并将其发送给我,这样我就可以验证、签名并发送到网络服务。 为此,我需要删除标签开头和结尾之间的空格: String
我写了几个方法来将项目添加到数组中,如果它们已经在数组中,它们将被忽略。在对数据结构做了一些研究之后,我意识到我可以通过简单地将它们放在一个集合中来摆脱重复(特别是因为我不关心对象的顺序)。然而,在玩
使用 HighCharts,我想移除 SVG 曲线上的抗锯齿。 到目前为止,我正在使用这个: $('path').each(function(i,j){$(j).attr('shape-renderi
由于某些奇怪的原因(黑色但不是黑色部分),我的 SeekBar 和拇指后面出现随机阴影。我该如何摆脱它? 我的搜索栏: 拇指.xml progress_appearance.xml(有一些
我有一个 Url,我想获取路径部分但没有尾随文件名。如果 Url 是 http://my.com/dir1/dir2/file.ext 那么我想获取 /dir1/dir2 . 我已经尝试了各种拆分(l
我有这个字符串: dataSourceURL = URL(string:"https://api.abc.com/api/p4/products?pid=uid8225&format=json&off
在我的网页中,我有一个菜单 (HorizontalPanel) 应该隐藏在页面的底部。为此,我尝试使用 RootLayoutPanel 类并在其中添加一个 south 小部件,我成功地做到了。但问
我是一名优秀的程序员,十分优秀!