正在尝试转换混合模式的公式
Trying to translate formula for blending mode
我使用opencv c++制作混合模式,就像在photoshop
中一样,我想在它中制作叠加模式,我在opencv中搜索它的替代品,我在其中找到了这种混合方式,但它不是叠加,因为我想在其中使用叠加方法。
文件中的叠加方法公式
(Target > 0.5) * (1 - (1-2*(Target-0.5)) * (1-Blend)) +
(Target <= 0.5) * ((2*Target) * Blend)
请任何人解释一下这个在opencv c++中实现的公式,我如何容易地理解它的实现,或者它是否有任何already
内置函数或任何其他简单的解决方法:p
overlay blending
实际做的是Multiplies the light colors and screens the dark colors
首先,您提供的链接的作者假设像素颜色为0到1之间的值。
假设您想要混合两个图像img1
和img2
。该公式表示,如果img1
中的像素为值Target > 0.5
,则对于混合图像,结果值为(1 - (1-2*(Target-0.5)) * (1-Blend))
,其中Blend
是img2
的像素的值。
另一方面,如果Target <= 0.5
,则得到的颜色值将是((2*Target) * Blend)
。
您需要对每个像素执行此操作。
此链接提供了OpenCV的覆盖混合功能。
这里是一个灰度图像的例子。对于RGB图像,需要对每个通道执行此操作。当然,img1
和img2
必须具有相同的大小。也许OpenCV有一种更快的方法。
Mat img1;
Mat img2;
img1 = imread("img1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
img2 = imread("img2.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat result(img1.size(), CV_32F);
for(int i = 0; i < img1.size().height; ++i){
for(int j = 0; j < img1.size().width; ++j){
float target = float(img1.at<uchar>(i, j)) / 255;
float blend = float(img2.at<uchar>(i, j)) / 255;
if(target > 0.5){
result.at<float>(i, j) = (1 - (1-2*(target-0.5)) * (1-blend));
}
else{
result.at<float>(i, j) = ((2*target) * blend);
}
}
}
相关文章:
- OpenCV 混合模式实现:为什么看似等效的操作会产生不同的结果?
- 混合模式程序集是针对版本 'v2.0.50727' 构建的 ...本机C++/Visual C++/C# 项目错误
- Visual Studio混合模式调试是否可以附加到Jupyter笔记本以同时调试C++和Python
- 如何链接到C++/Cli混合模式dll中的本机类
- 可以混合复合模式和奇怪的重复模板模式
- 通用设计与奇怪的重复模板模式混合在一起.C++
- 调试混合模式应用程序(C# 和非托管 C++)时"The breakpoint will not currently be hit"错误
- 混合模式程序集(C++/CLI项目)在.NET Core上工作吗
- 将命令模式,工厂模式和模板混合在一起..
- 错误:"混合的隐式和静态模式规则"在我的生成文件中
- 具有混合依赖项的生成文件模式规则
- 如何处理混合模式项目中的打印
- c++ (Direct2D) 中的混合模式
- C++中的两种不同的mixin模式.(混合蛋白?CRTP?)
- 链接到混合模式dll中的presentationcore.dll
- 通过混合模式c++ /CLI DLL从ETL工具中使用托管c# DLL -可能
- 内存管理在c++混合模式下的应用
- 如何将使用boost::asio的本地c++静态库导入CLI/ c++混合模式应用程序?
- 卸载混合模式组件
- 如何在文本模式下安全地混合 std::ifstream 的 tellg、seekg 和 read(*,n) 方法