matlab繪製色盤 色調混合模式

2021-08-27 21:39:11 字數 3185 閱讀 7821

[size=x-large][color=blue]1、繪製色盤[/color][/size]

**統一放到最後。

結果如下

[img]

[color=blue][size=x-large]2、色調(hue)混合模式[/size][/color]

葉明大神的用色調混合模式降低某一色彩的飽和度的文章:[url]

主要步驟為,新建乙個待降低飽和度的色彩的圖層,反相,圖層混合模式改為色相,圖層不透明度改為50%以下。

除了色調模式外此外,單色圖層單色圖層還可以使用以下混合模式[url]

[list]

[*]正片疊底:給高光部分著色

[*]濾色: 給陰影部分著色

[*]柔光: 整體著色,但比正常模式柔和

[/list]

色調混合模式使用混合色的色調、基色的飽和度和明度。

但是,,,,ps中的色調混合模式不完全是這樣的。。。

這裡有個別人實現的結果與ps做對比,可以發現ps中優化了不少![url]

本文僅從理論上簡單做個理論驗證。

使用的公式是

xb=x*opacity+(1-opacity)*xs; 

yb=y*opacity+(1-opacity)*ys;

也就是把乙個顏色中的色調、飽和度當做乙個二維向量根據不透明度加權求和。

這麼一來,飽和度也是要變的!!(ps中也會變)應該是合成向量所示的飽和度再乘以基色的飽和度。(這個沒實現。)

不透明度為0.5時的一組使用色調混合模式引起的色彩偏移如下圖所示:

[img]

**:

function [colordiskrgbimage,x,y]=lccolourdisk(r)

% 生成色盤影象

%r: 色盤半徑-0.5。即色盤直徑為2r+1

%輸出:

%colordiskrgbimage 色盤影象,為(2r+1)*(2r+1)大小的。

%x:與色盤影象大小一樣,對應於色盤影象中每個畫素的x座標。

%y::與色盤影象大小一樣,對應於色盤影象中每個畫素的y座標。

if(nargin==0)

r=400;

end%生成座標網格

x=-r:r;

x=x/r;%歸一化到區間[-1,1]

y=x;

[x,y]=meshgrid(x,y);

%生成hue

theta=atan2(y,x);

theta(theta<0)=theta(theta<0)+2*pi;

hue=theta/2/pi;

%生成saturation

saturation=sqrt(x.^2+y.^2);

saturation(saturation>1)=0;%將位於色盤外的部分設定成沒有顏色

%生成value

value=ones(size(x));

imhsv=cat(3,hue,saturation,value);

colordiskrgbimage=hsv2rgb(imhsv);

if(nargout==0)

colordiskrgbimage=flipud(colordiskrgbimage); %注意matlab中y軸方向朝下,與一般情況不同,所以要翻轉一下y座標。

imshow(colordiskrgbimage);

endend

function blendhue(huetoblend,opacity,colordisk,x,y,npoints)

%繪製色調混合模式下的色彩偏移影象

%huetoblend: 混合色色調,[0,1]

%opacity: 混合色的不透明度

%colordisk,x,y 為lccolourdisk的輸出

%npoints: 基色的點數

d=size(colordisk,1);

r=floor(d/2);

center=ceil(d/2);

theta=huetoblend*2*pi;

thetas=linspace(0,2*pi,npoints);%選n個點作為基色

% thetadiff=thetas-theta;

% thetadiff(thetadiff<0)=thetadiff(thetadiff<0)+2*pi;

% thetadiff(thetadiff>pi)=thetadiff(thetadiff>pi)-2*pi; %保證角度在[-pi, pi]之間

% thetasblended=theta+thetadiff*(1-opacity);

% factor=1;

[x y]=theta2xy(theta,center,r);

[xs ys]=theta2xy(thetas,center,r);

xb=x*opacity+(1-opacity)*xs;

yb=y*opacity+(1-opacity)*ys;

imshow(colordisk);

hold on

plot(x,y,'ok')

%quiver(center,center,xh-center,yh-center,0,'k');

plot(xs,ys,'*k')

plot(xb,yb,'pk');

quiver(xs,ys,xb-xs,yb-ys,0,'k');

legend('混合色','基色','結果色')

t=['色調混合模式下混色結果:opcacity=' num2str(opacity)];

title(t)

axis xy %設定座標軸y方向從下到上!!

endfunction [x,y]=theta2xy(theta,center,r)

x=center+r*cos(theta);

y=center+r*sin(theta);

end

%hue混合模式繪圖的入口程式

close all

[colordisk,x,y]=lccolourdisk(400);

huetoblend=0;

opacity=0.5;

npoints=21;

blendhue(huetoblend,opacity,colordisk,x,y,npoints)

從RGB色轉為灰度色演算法

一 基礎 對於彩色轉灰度,有乙個很著名的心理學公式 gray r 0.299 g 0.587 b 0.114 二 整數演算法 而實際應用時,希望避免低速的浮點運算,所以需要整數演算法。注意到係數都是3位精度的沒有,我們可以將它們縮放1000倍來實現整數運算演算法 gray r 299 g 587 b...

雙色 三色排序問題

實現乙個函式,給定乙個陣列,要求使得陣列中負數在所有正數的前面 實現乙個函式,給定乙個陣列,要求使得陣列中負數在前正數在後零在中間 1 include2 include34 輸出陣列元素 5void print int arr,int len 6 交換兩個數 7void swap int left,...

Arduino使用三色 雙色LED

1 三色led 然後是這兩種led的實物圖,上搜了一下,這種三色led,有乙個gnd引腳的好像叫做共陰rgb全彩led發光二極體,總共有四個引腳 gnd引腳接arduino的gnd引腳,r g b三個引腳分別對應著red green blue,這三個引腳應該接arduino中的模擬引腳。顯示三色的原...