论文回顾:Playful Palette: An Interactive Parametric Color Mixer for Artists

Playful Palette: An Interactive Parametric Color Mixer for Artists 发表于TOG 2017,这篇论文提出了一种新的调色板叫做:Playful Palette。跟之前的调色板比如 [Chang 2013] 基于聚类的调色板 和 [Tan 2017] 基于凸包的调色板不一样的是,之前的调色板基本只能对已有图像的颜色进行修改。而本文则真正意义上生成了可供画家使用的调色板,即可以生成多种颜色(颜料)的混合渐变颜色。

按惯例,先上一张teaser。(a)中圆圈内部展示的是当前使用的几种颜色生成的调色板,可以看出有光滑的渐变效果。圆圈上是历史颜色记录,以及圆圈外部每种颜色对应的那个时刻的调色板,这主要用于回退到某一步或修改颜色。(b)在调色板中选择颜色绘画;(c)绘画效果,(d)通过调色板历史记录修改图像颜色。
在这里插入图片描述

论文指出Color Picker的研究没有得到研究重视,当前的颜色用户接口已经无法满足数字绘画的需求。论文首先针对数字绘画存在的问题进行了初步的用户调研。调研标明现有Color Picker最显著的缺点就是无法混合多种颜色,而真实绘画经常需要将多种颜料调制出新的颜色以满足需求。因此,本文最重要的贡献就是提出一种新的调色板可以混合多种颜色并生成光滑的颜色渐变效果。

一、Playful Palette原理

该调色板由多个圆形的颜色水滴(Blob)生成,每个颜色水滴可以表示为一个元祖: B i = ( r i , g i , b i , x i , y i , r i ) B_i = (r_i,g_i,b_i,x_i,y_i, r_i) Bi=(ri,gi,bi,xi,yi,ri), 其中 c i = ( r i , g i , b i ) c_i=(r_i,g_i,b_i) ci=(ri,gi,bi)是这个水滴的颜色, p i = ( x i , y i ) p_i=(x_i,y_i) pi=(xi,yi) r i r_i ri 分别这个水滴的圆心和半径。

给定一个矩形或圆形包围盒(总之包住所有颜色水滴), 以及内部的多个颜色水滴 B { B 1 , B 2 , . . . B k } B\{B_1,B_2,...B_k\} B{B1,B2,...Bk}, 我们要得到这些水滴生成的调色板。直观上,每个颜色水滴对应一个圆形区域,包围盒中的像素跟哪个水滴的位置与越接近,颜色也就越接近。为此,我们遍历包围盒中的每个位置并计算它们的颜色。

包围盒中某个像素 p p p 受到水滴 B i B_i Bi的影响权重可以表示为:
M i ( p ) = F ( B i , p ) = { 1 − 4 d 6 9 b 6 + 17 d 4 9 b 4 − 22 d 2 9 b 2 d ≤ b 0  else  (1) M_i(p) = F(B_i,{p})=\left\{\begin{array}{ll} 1-\frac{4 d^{6}}{9 b^{6}}+\frac{17 d^{4}}{9 b^{4}}-\frac{22 d^{2}}{9 b^{2}} & d \leq b \\ 0 & \text { else } \end{array}\right.\tag1 Mi(p)=F(Bi,p)={19b64d6+9b417d49b222d20db else (1)

其中, d d d 表示 p p p 到 水滴 B i B_i Bi 的圆心 ( x i , y i ) (x_i,y_i) (xi,yi) 的距离, b b b 是一个调整参数这里可以取为半径即: b = r i b = r_i b=ri.

绘制调色板过程中,同一个像素受到多个水滴的权重之和 大于给定的阈值才绘制,否则为白色。
c ( p ) = { ∑ i M i ( p ) ⋅ c i ∑ i M i ( p ) ∑ i M i ( p ) > = T w h i t e  else  (2) c(p) = \left\{\begin{array}{ll} \frac{\sum_i M_i(p) \cdot c_i}{\sum_i M_i(p) } & \sum_i M_i(p) >= T \\ white & \text { else } \end{array}\right. \tag2 c(p)={iMi(p)iMi(p)ciwhiteiMi(p)>=T else (2)
这里 T = 0.6 T = 0.6 T=0.6.

其实,水滴生成的调色板的边界就是 公式(2) 对应的 c ( p ) = T c(p) = T c(p)=T 的等值线,博主 Birdy_C 画了一张示意图展示了两个水滴的合成效果。
在这里插入图片描述

需要注意的是,修改公式(1)中 b b b 的值可以改变每个水滴的影响范围。我们令 z = d / b z = d/b z=d/b, 那么上式当 d < b d < b d<b 成立时, M i ( p ) M_i(p) Mi(p)可以写为:

M i ( p ) = 1 − 4 9 x 6 + 17 9 x 4 − 22 9 x 2 M_i(p) = 1 - \frac{4}{9}x^6 + \frac{17}{9}x^4 - \frac{22}{9}x^2 Mi(p)=194x6+917x4922x2
这个函数的图像如下所示:可以看出干函数在0,1之间单调递减,也就是说我们当我们改变增大 b b b, x = d / b x = d/b x=d/b 变小,从而 M i ( p ) M_i(p) Mi(p) 变大,因此水滴影响范围变大。

在这里插入图片描述
论文中给出的多个水滴生成得调色板效果:
在这里插入图片描述

二、简单实现

#include  <vector> 
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

void DrawPlayfulPalette() {
	vector<Vec6d> blobs; //r,g,b,x,y
	blobs.push_back(Vec6d(255, 0, 0, 120, 45));
	blobs.push_back(Vec6d(0, 0, 255, 120, 135));
	blobs.push_back(Vec6d(0, 255, 0, 50, 90));
	
	int rows = 200, cols = 200;
	cv::Mat img = cv::Mat(rows, cols, CV_8UC3, Scalar(255, 255, 255));

	for (int r = 0; r < rows; r++) {
		uchar* data = img.ptr<uchar>(r);
		for (int c = 0; c < cols; c++) {
			Vec2d pix_pos(r , c);

			Vec3d sum_color(0, 0, 0);
			Vec3i res_color(0, 0, 0);
			double sum_w = 0;

			for (int i = 0; i < blobs.size(); i++) {
				Vec3d blob_color(blobs[i][0], blobs[i][1], blobs[i][2]);
				Vec2d blob_pos(blobs[i][3], blobs[i][4]);

				double d2 = (pix_pos - blob_pos).dot(pix_pos - blob_pos);
				double b2 = 70 * 70;
				double db = d2 / b2;

				double w = d2  <= b2 ? 1 - 4 / 9 * pow(db, 3) + 17 / 9 * pow(db, 2) - 22 / 9 * db : 0;
				sum_w += w;
				sum_color += w * blob_color;
			}
			res_color = sum_w < 0.6 ? Vec3d(255, 255, 255): sum_color / sum_w;
			data[3 * c + 0] = res_color[2];
			data[3 * c + 1] = res_color[1];
			data[3 * c + 2] = res_color[0];
		}
	}
	imshow("PlayfulPalette", img);
	waitKey();
}

绘制了几个简单的调色板效果:
在这里插入图片描述
文章的其他部分主要讲如何保持历史记录,我不太感兴趣,因此就不再赘述。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Researcher-Du

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值