我试图以编程方式更改白点/白平衡.这就是我想要完成的任务:
- 从图像中选择一个(随机)像素
- 获取该像素的颜色
- 转换图像,使该颜色的所有像素都转换为白色,并移动所有其他颜色以匹配
我已经完成了前两个步骤,但第三步并没有真正解决.
起初我认为,根据Apples的文档,CIWhitePointAdjust应该是完全可以完成的事情,但是,尽管它确实改变了图像,但它没有做我想要/希望它做的事情.
然后似乎CIColorMatrix应该能够帮助我改变颜色,但是我(现在仍然)却厌倦了用那些讨厌的向量输入它的东西.我已经尝试了几乎所有的东西(所有矢量上的相同RGB值,每个矢量上的相应值(R代表R等),1 - 对应值,1 +对应值,1 /对应值.RGB值和不同(1 - x ,1 + x,1/x).
我也遇到了CITemperatureAndTint,根据Apples文档也应该有所帮助,但我还没有弄清楚如何从RGB转换为温度和色调.我已经看到了关于从RGB转换到Temperatur的算法和公式,但没有关于色调的内容.我会继续尝试这一点.
任何帮助非常感谢!
我一直在使用OpenCV和Apple的Accelerate框架,发现Accelerate的性能很慢,Apple的文档有限.我们举个例子:
void equalizeHistogram(const cv::Mat &planar8Image, cv::Mat &equalizedImage)
{
cv::Size size = planar8Image.size();
vImage_Buffer planarImageBuffer = {
.width = static_cast<vImagePixelCount>(size.width),
.height = static_cast<vImagePixelCount>(size.height),
.rowBytes = planar8Image.step,
.data = planar8Image.data
};
vImage_Buffer equalizedImageBuffer = {
.width = static_cast<vImagePixelCount>(size.width),
.height = static_cast<vImagePixelCount>(size.height),
.rowBytes = equalizedImage.step,
.data = equalizedImage.data
};
TIME_START(VIMAGE_EQUALIZE_HISTOGRAM);
vImage_Error error = vImageEqualization_Planar8(&planarImageBuffer, &equalizedImageBuffer, kvImageNoFlags);
TIME_END(VIMAGE_EQUALIZE_HISTOGRAM);
if (error != kvImageNoError) {
NSLog(@"%s, vImage error %zd", __PRETTY_FUNCTION__, error);
}
}
Run Code Online (Sandbox Code Playgroud)
此调用大约需要20ms.这具有在我的应用程序中无法使用的实际意义.也许直方图的均衡本质上很慢,但我也测试了BGRA->灰度,发现OpenCV可以在~5ms内完成,vImage需要~20ms.
在测试其他功能时,我发现了一个项目,该项目创建了一个带有模糊功能(gist)的简单滑块应用程序,我将其清理干净以进行测试.大约~20ms.
是否有一些技巧可以让这些功能更快?