基本上我想为我的油漆应用程序实现颜色替换功能。以下是原始和预期的输出
原来的:
在更改用户选择的墙壁颜色以及一些替换阈值后
我尝试了两种方法,但无法按预期工作
方法 1:用于颜色替换
的基于队列的 Flood Fill算法,但我的输出速度非常慢,并且没有保留墙阴影。
方法 2: 所以我试图查看另一个选项,并在下面的帖子中找到了 SO 如何更改图像中的特定颜色?
但我无法理解逻辑,也不确定我在第 3 步中的代码实现。
请根据我的理解为每一步找到以下代码。
1) 使用 cvCvtColor 将图像从 RGB 转换为 HSV(我们只想改变色调)。
IplImage *mainImage=[self CreateIplImageFromUIImage:[UIImage imageNamed:@"original.jpg"]];
IplImage *hsvImage = cvCreateImage(cvGetSize(mainImage), IPL_DEPTH_8U, 3);
IplImage *threshImage = cvCreateImage(cvGetSize(mainImage), IPL_DEPTH_8U, 3);
cvCvtColor(mainImage,hsvImage,CV_RGB2HSV);
2) 用 cvThreshold 指定一定的容差来隔离颜色(您需要一系列颜色,而不是单一颜色)。
cvThreshold(hsvImage, threshImage, 0, 100, CV_THRESH_BINARY);
3) 使用 cvBlobsLib 之类的斑点检测库丢弃颜色低于最小尺寸的区域。这将消除场景中相似颜色的点。我需要指定原始图像或阈值图像吗?
CBlobResult blobs = CBlobResult(threshImage, NULL, 0);
blobs.Filter( blobs, B_EXCLUDE, CBlobGetArea(), B_LESS, 10);
4) 用 cvInRangeS 遮罩颜色,并使用生成的遮罩应用新的色调。
不确定此功能如何帮助颜色替换并且无法理解要提供的参数。
5) cvMerge 新图像与新色调与由您在第一步中保存的饱和度和亮度通道组成的图像。
我知道 cvMerge 将合并 HS 和 V 的三个通道,但是我如何使用上述三个步骤的输出。
所以基本上坚持使用opencv实现,
如果可能的话,请指导我进行 opencv 实施或任何其他尝试解决方案。