这里不多说了,彩色图片在计算机中以R、G、B三通道存储。也就是说,读取一个彩色图片,会生成一个 M × N × 3 {M\times N\times 3} M×N×3的matrix。
索引图像有两个分量:整数数据矩阵 X 和彩色映射矩阵 map。矩阵 map 是 m×3 大小、由 double 类型且范围在[0,1]之间的浮点数构成的数组。
这里我们使用function rgb2ind可以将RGB彩色图像转换为索引图像,并且返回对应的map,语法如下:
[X, cmap] = rgb2ind(RGB, Q)
[X, cmap] = rgb2ind(RGB, tol)
X = rgb2ind(RGB, inmap)
当我们想要显示一幅indexed image时,可以使用一下语句:
>> imshow(X, map)
或:
>> image(X)
>> colormap(map)
或:
>> imagesc(X)
>> colormap(map)
其中,imshow默认的map实际上是gray(256),也就是灰度图像的转换;image中是对indexed image X进行直接映射;imagesc中是对indexed image X进行线性映射。
所以,从结果上来看,imagesc会比image效果更好,因为image属于直接映射,index image中pixel的值是多少,对应的color就是多少,一般默认为N个color时,小于最低color的值都置为minimum color,大于最大color的值都置于maximum color。
有时候,用较少的颜色去近似表达索引图像是有必要的。一般使用function imapprox来增减颜色个数:
[Y, newmap] = imapprox(X, map, n)
其中,n是最多的颜色个数,如果n小于等于256,那么输出 Y 是 uint8 类;如果 n 大于 256,那么 Y 是 double 类。
下表是有关RGB image、Indexed image、Gray Image之间转换使用的函数:
Function | Description |
---|---|
dither | 采用“抖动”方法从 RGB 图像创建索引图像 |
grayslice | 从灰度图像通过阈值处理创建索引图像 |
gray2ind | 从灰度图像创建索引图像 |
ind2gray | 从索引图像创建灰度图像 |
rgb2ind | 从 RGB 图像创建索引图像 |
ind2rgb | 从索引图像创建 RGB 图像 |
rgb2gray | 从 RGB 图像创建灰度图像 |
一般来说,抖动是通过增加人工噪声去减少一个图像的颜色空间,主旨在于,一个区域的光量应该保持一致。弗洛伊德-斯坦伯格抖动算法对周围的像素使用非均匀分布的量化误差达到抖动的目的。
当处理彩色图像时,**抖动(dither)**主要是与函数 rgb2ind 联合起来以减少图像中的颜色数目。
下面对各function进行一个讨论:
function dither:采用“抖动”方法从 RGB 图像创建索引图像:
bw = dither(image) % 灰度图像的抖动实现,返回抖动处理后的二值图像(逻辑类)
X = dither(RGB,MAP) % 通过抖动颜色图 map 中的颜色创建 RGB 图像的索引图像近似值。
X = dither(RGB,MAP,Qm,Qe) % 指定要沿每个颜色轴为逆向颜色图使用的量化位数 Qm,以及用于颜色空间误差计算的量化位数 Qe。
function grayslice:这个函数使用阈值对灰度图像进行阈值处理以产生索引图像
X = grayslice(gray_image, n)
X = grayslice(gray_image, v) % v是矢量(值的范围为[0,1]),用来给gray_image赋阈值
1 n , 2 n , … , n − 1 n \frac{1}{n},\frac{2}{n},\dots,\frac{n-1}{n} n1,n2,…,nn−1
function gray2ind:围绕图像 gray_image,使用彩色映射 gray(n)生成索引图像 X
[X, map] = gray2ind(gray_image, n) % n默认为64
输入图像的类型可以是 uint8、uint16 或 double。如果 n 的值小 于等于 256,那么输出图像 X 的类型是 uint8;如果 n 的值大于 256,那么类型是 uint16。
function ind2gray:把由 X 和 map 构成的索引图像转换成灰度图像。数组 X 的类型可以是 uint8、 uint16 或 double。输出图像是 double 类。
gray_image = ind2gray(X, map)
function rgb2ind:将RGB 格式转换成矩阵 X 和对应的彩色映射 map 。
[X, map] = rgb2ind(rgb_image, n, dither_option)
n 决定 map 的颜色数目,dither_option 可以是如下两个值之一:‘dither’(默认值)、‘nodither’。输入图 像可以是 uint8、uint16 或 double 类。如果 n 的值小于等于 256,输出数组 X 是 uint8 类,否则便是 uint16 类。
function ind2rgb:将矩阵 X 和对应的彩色映射 map 转换成 RGB 格式。
rgb_image = ind2rgb(X, map)
X 可以是 uint8、uint16 或 double 类。输出的 RGB 图像是大小为 M×N×3 的 double 类的数组。
function rgb2gray:将 RGB 图像转换成灰度图像。
gray_image = rgb2gray(rgb_image)
输入的 RGB 图像可以是 uint8、uint16 或 double 类,输出图像与输入图像的类相同。
Example Illustartion of some of the functions above:
>> f = imread('Fig0604(a).tif');
>> [X1, map1] = rgb2ind(f, 8, 'nodither');
>> imshow(X1, map1)
>> [X2, map2] = rgb2ind(f, 8, 'dither');
>> figure, imshow(X2, map2)
>> g = rgb2gray(f);
>> g1 = dither(g);
>> figure, imshow(g); figure, imshow(g1);
对于RGB,抖动处理可以通过“随机性”的结果,缓解图像量化时产生的伪轮廓现象;抖动处理的效果用灰度图像来说明往往更好,因为转化为二值图像,数据量显著减少
RGB 只是一种彩色空间,当然还有其他的彩色空间(又被称作彩色模型),它们在应用中的使用可能比 RGB 更方便 或更恰当。这些模型是 RGB 模型的变换,包括 NTSC、YCbCr、HSV、CMY、CMYK 和 HSI 彩色空间。
NTSC 彩色空间用于模拟电视。
在 NTSC 格式中,图像数据由三部分组成: 亮度(Y)、色调(I)和饱和度(Q)。
Advantages:灰度信息和彩色数据是分离开来的, 所以同一信号可以用于彩色电视机和黑白电视机。
NTSC与RGB分量的关系为:
KaTeX parse error: Undefined control sequence: \matrix at position 8: \left[\̲m̲a̲t̲r̲i̲x̲{Y\\I\\Q}\right…
转换函数为function rgb2ntsc和function ntsc2rgb:
yiq_image = rgb2ntsc(rgb_image)
rgb_image = ntsc2rgb(yiq_image)
yiq_image(: ,:, 1)是亮度、yiq_image(:, :, 2)是色调、 yiq_image(:, :, 3)代表饱和度。
YCbCr 彩色空间广泛用于数字视频。
在这种格式中,*亮度信息用单独的分量 Y 来表示,彩色信息*是用两个色差分量 Cb 和 Cr 来存储的。分量 Cb 是蓝色分量与参考值的差,分量 Cr 是红色分量与参考值的差。
YCbCr与RGB分量的关系为:
KaTeX parse error: Undefined control sequence: \matrix at position 8: \left[\̲m̲a̲t̲r̲i̲x̲{Y\\Cb\\Cr}\rig…
转换函数为function rgb2ycbcr和function ycbcr2rgb:
ycbcr_image = rgb2ycbcr(rgb_image)
rgb_image = ycbcr2rgb(ycbcr_image)
HSV(hue色调、saturation饱和度、value值/明亮度)比 RGB 系统更接近人们的经验和对彩色的感知。通常V的优先级要大于S的优先级。
HSV彩色空间可以通过从RGB彩色立方体沿灰度轴(连接黑色顶点和白色顶点的轴)用公式来表达。V=0,轴的末端为黑色;V=1,轴的末端为白色。
HSV与RGB分量的关系为:
H S V − > R G B : Conditions : 0 ≤ H < 36 0 ∘ , 0 ≤ S ≤ 1 , 0 ≤ V ≤ 1 C = V × S X = C × ( 1 − ∣ ( H / 6 0 ∘ m o d 2 − 1 ∣ ) m = V − C ( R ′ , G ′ , B ′ ) = { ( C , X , 0 ) 0 ≤ H < 6 0 ∘ ( X , C , 0 ) 6 0 ∘ ≤ H < 12 0 ∘ ( 0 , C , X ) 12 0 ∘ ≤ H < 18 0 ∘ ( 0 , X , C ) 18 0 ∘ ≤ H < 24 0 ∘ ( X , 0 , C ) 24 0 ∘ ≤ H < 30 0 ∘ ( C , 0 , X ) 30 0 ∘ ≤ H < 36 0 ∘ ( R , G , B ) = ( ( R ′ + m ) × 255 , ( G ′ + m ) × 255 , ( B ′ + m ) × 255 ) R G B − > H S V : Conditions : R,G,B values are dvided by 255 to change the range from 0...255 to 0...1 R ′ = R / 255 G ′ = G / 255 B ′ = B / 255 C m a x = max ( R ′ , G ′ , B ′ ) C m i n = min ( R ′ , G ′ , B ′ ) Δ = C m a x − C m i n Hue calculation : H = { 0 ∘ Δ = 0 6 0 ∘ × ( G ′ − B ′ Δ m o d 6 ) C m a x = R ′ 6 0 ∘ × ( B ′ − R ′ Δ m o d 6 ) C m a x = R ′ 6 0 ∘ × ( R ′ − G ′ Δ m o d 6 ) C m a x = R ′ Saturation calculation : S = { 0 C m a x = 0 Δ C m a x C m a x ≠ 0 Value calculation : V = C m a x \begin{aligned} HSV->RGB:\\ &\text{Conditions}:0\le H\lt360^\circ,0\le S\le1,0\le V\le1\\\\ &C=V\times S\\ &X=C\times(1-|(H/60^\circ\mod2-1|)\\ &m=V-C\\ &(R',G',B')= \begin{cases} (C,X,0)&0\le H\lt60^\circ\\ (X,C,0)&60^\circ\le H\lt120^\circ\\ (0,C,X)&120^\circ\le H\lt180^\circ\\ (0,X,C)&180^\circ\le H\lt240^\circ\\ (X,0,C)&240^\circ\le H\lt300^\circ\\ (C,0,X)&300^\circ\le H\lt360^\circ\\ \end{cases}\\ &(R,G,B)=((R'+m)\times255,(G'+m)\times255,(B'+m)\times255)\\ \\RGB->HSV:\\ &\text{Conditions}:\text{R,G,B values are dvided by 255 to change the range from 0...255 to 0...1}\\\\ &R'=R/255\\ &G'=G/255\\ &B'=B/255\\ &Cmax=\max{(R',G',B')}\\ &Cmin=\min{(R',G',B')}\\ &\Delta=Cmax-Cmin\\ \\&\text{Hue calculation}:\\ &H= \begin{cases} 0^\circ&\Delta=0\\ 60^\circ\times(\frac{G'-B'}{\Delta}\mod6)&Cmax=R'\\ 60^\circ\times(\frac{B'-R'}{\Delta}\mod6)&Cmax=R'\\ 60^\circ\times(\frac{R'-G'}{\Delta}\mod6)&Cmax=R' \end{cases}\\ \\&\text{Saturation calculation}:\\ &S= \begin{cases} 0&Cmax=0\\ \frac{\Delta}{Cmax}&Cmax\ne0 \end{cases}\\ \\&\text{Value calculation}:\\ &V=Cmax \end{aligned} HSV−>RGB:RGB−>HSV:Conditions:0≤H<360∘,0≤S≤1,0≤V≤1C=V×SX=C×(1−∣(H/60∘mod2−1∣)m=V−C(R′,G′,B′)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧(C,X,0)(X,C,0)(0,C,X)(0,X,C)(X,0,C)(C,0,X)0≤H<60∘60∘≤H<120∘120∘≤H<180∘180∘≤H<240∘240∘≤H<300∘300∘≤H<360∘(R,G,B)=((R′+m)×255,(G′+m)×255,(B′+m)×255)Conditions:R,G,B values are dvided by 255 to change the range from 0...255 to 0...1R′=R/255G′=G/255B′=B/255Cmax=max(R′,G′,B′)Cmin=min(R′,G′,B′)Δ=Cmax−CminHue calculation:H=⎩⎪⎪⎪⎨⎪⎪⎪⎧0∘60∘×(ΔG′−B′mod6)60∘×(ΔB′−R′mod6)60∘×(ΔR′−G′mod6)Δ=0Cmax=R′Cmax=R′Cmax=R′Saturation calculation:S={0CmaxΔCmax=0Cmax=0Value calculation:V=Cmax
转换函数为function rgb2hsv和function hsv2rgb:
hsv_image = rgb2hsv(rgb_image)
rgb_image = hsv2rgb (hsv_image)
青色Cyan、紫红色Magenta和黄色Yellow是光的二次色,或者换一种说法,它们是颜料的原色。
CMYK则是在CMY的基础上引入黑色的一个模型。
CSV与RGB分量的关系为:
KaTeX parse error: Undefined control sequence: \matrix at position 8: \left[\̲m̲a̲t̲r̲i̲x̲{C\\M\\Y}\right…
function imcomplement函数可近似地把 RGB 模型转换为 CMY 模型,也可以将 CMY 图像转换为 RGB 图像
cmy_image = imcompliment(rgb_image)
rgb_image = imcompliment(cmy_image)
HSI(hue色调、saturation饱和度、Intensity强度),该模型将强度分量与从一幅彩 色图像中承载的彩色信息分开。较为理想。
假定RGB值已经归一化在[0,1]之间,角度 θ {\theta} θ使用关于HSI空间的红轴来度量。
将从H的公式中得出的所有结果除以360°,即可将色调归一化在[0,1]之间。
转换关系有:
Hue calculation : H = { θ B ≤ G 360 − θ B > G θ = cos − 1 { 0.5 [ ( R − G ) + ( R − B ) ] [ ( R − G ) 2 + ( R − B ) ( G − B ) ] 1 / 2 } H = H / 2 π Saturation calculation : S = 1 − 3 R + G + B [ min ( R , G , B ) ] Intensity calculation : I = 1 3 ( R + G + B ) \begin{aligned} &\text{Hue calculation}:\\ &H= \begin{cases} \theta&B\le G\\ 360-\theta&B\gt G \end{cases}\\ &\theta=\cos^{-1}\Bigg\{\frac{0.5[(R-G)+(R-B)]}{[(R-G)^2+(R-B)(G-B)]^{1/2}}\Bigg\}\\ &H=H/2\pi\\\\ &\text{Saturation calculation}:\\ &S=1-\frac{3}{R+G+B}[\min{(R,G,B)}]\\\\ &\text{Intensity calculation}:\\ &I=\frac{1}{3}(R+G+B) \end{aligned} Hue calculation:H={θ360−θB≤GB>Gθ=cos−1{[(R−G)2+(R−B)(G−B)]1/20.5[(R−G)+(R−B)]}H=H/2πSaturation calculation:S=1−R+G+B3[min(R,G,B)]Intensity calculation:I=31(R+G+B)
给定在[0,1]之间的 HSI 值,我们现在希望找出同一范围内相应的 RGB 值。
这里不要忘记对H乘上360,因为在做rgb2hsi时为实现H的归一化,我们最终输出H是除以了360,所以这里再编程时要记得乘回来。
转换关系有:
R , G , B = { I [ 1 + S cos H cos ( 6 0 ∘ − H ) ] 3 I − ( R + B ) I ( 1 − S ) 0 ∘ ≤ H < 12 0 ∘ I ( 1 − S ) I [ 1 + S cos H c cos ( 18 0 ∘ − H ) ] 3 I − ( R + G ) 12 0 ∘ ≤ H < 24 0 ∘ 3 I − ( B + G ) I ( 1 − S ) I [ 1 + S cos H − 24 0 ∘ cos ( 30 0 ∘ − H ) ] 24 0 ∘ ≤ H < 36 0 ∘ \begin{aligned} R,G,B= \begin{cases} I\bigg[1+\frac{S\cos{H}}{\cos{(60^\circ-H)}}\bigg]&3I-(R+B)&I(1-S)&0^\circ\le H\lt120^\circ\\ I(1-S)&I\bigg[1+\frac{S\cos{Hc}}{\cos{(180^\circ-H)}}\bigg]&3I-(R+G)&120^\circ\le H\lt240^\circ\\ 3I-(B+G)&I(1-S)&I\bigg[1+\frac{S\cos{H-240^\circ}}{\cos{(300^\circ-H)}}\bigg]&240^\circ\le H\lt360^\circ\\ \end{cases} \end{aligned} R,G,B=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧I[1+cos(60∘−H)ScosH]I(1−S)3I−(B+G)3I−(R+B)I[1+cos(180∘−H)ScosHc]I(1−S)I(1−S)3I−(R+G)I[1+cos(300∘−H)ScosH−240∘]0∘≤H<120∘120∘≤H<240∘240∘≤H<360∘
function rgb2hsi:
function hsi = rgb2hsi(rgb)
%RGB2HSI Converts an RGB image to HSI.
% HSI = RGB2HSI(RGB) converts an RGB image to HSI. The input image
% is assumed to be of size M-by-N-by-3, where the third dimension
% accounts for three image planes: red, green, and blue, in that
% order. If all RGB component images are equal, the HSI conversion
% is undefined. The input image can be of class double (with
% values in the range [0, 1]), uint8, or uint16.
%
% The output image, HSI, is of class double, where:
% HSI(:, :, 1) = hue image normalized to the range [0,1] by
% dividing all angle values by 2*pi.
% HSI(:, :, 2) = saturation image, in the range [0, 1].
% HSI(:, :, 3) = intensity image, in the range [0, 1].
% Extract the individual component images.
rgb = im2double(rgb);
r = rgb(:,:,1);
g = rgb(:,:,2);
b = rgb(:,:,3);
% Implement the conversion equations.
num = 0.5*((r-g)+(r-b));
den = sqrt((r-g).^2+(r-b).*(g-b));
theta = acos(num./(den+eps));
H = theta;
H(b > g) = 2*pi - H(b > g);
H = H/(2*pi);
num = min(min(r, g), b);
den = r + g + b;
S = 1 - 3.*num./den;
H(S == 0) = 0;
I = (r + g + b)/3;
% Combine all three results into an hsi image.
hsi = cat(3, H, S, I);
function hsi2rgb:
function rgb = hsi2rgb(hsi)
%HSI2RGB Converts an HSI image to RGB.
% RGB = HSI2RGB(HSI) converts an HSI image RGB, where HSI is
% assumed to be of class double with:
% HSI(:, :, 1) = hue image, assumed to be in the range
% [0, 1] by having been divided by 2*pi.
% HSI(:, :, 2) = saturation image, in the range [0, 1];
% HSI(:, :, 3) = intensity image, in the range [0, 1].
%
% The components of the output image are:
% RGB(:, :, 1) = red.
% RGB(:, :, 2) = green.
% RGB(:, :, 3) = blue.
% Extract the individual HSI component images.
H = hsi(:, :, 1) * 2 * pi;
S = hsi(:, :, 2);
I = hsi(:, :, 3);
% Implement the conversion equations.
R = zeros(size(hsi, 1), size(hsi, 2));
G = zeros(size(hsi, 1), size(hsi, 2));
B = zeros(size(hsi, 1), size(hsi, 2));
% RG sector (0 <= H < 2*pi/3).
idx = find((0 <= H) & (H < 2*pi/3));
B(idx) = I(idx) .* (1 - S(idx));
R(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx)) ./ ...
cos(pi/3 - H(idx)));
G(idx) = 3*I(idx) - (R(idx) + B(idx));
% BG sector (2*pi/3 <= H < 4*pi/3).
idx = find((2*pi/3 <= H) & (H < 4*pi/3));
R(idx) = I(idx) .* (1 - S(idx));
G(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 2*pi/3) ./ ...
cos(pi - H(idx)));
B(idx) = 3*I(idx) - (R(idx) + G(idx));
% BR sector (4*pi/3 <= H < 2*pi).
idx = find((4*pi/3 <= H));
G(idx) = I(idx) .* (1 - S(idx));
B(idx) = I(idx) .* (1 + S(idx) .* cos(H(idx) - 4*pi/3) ./ ...
cos(5*pi/3 - H(idx)));
R(idx) = 3*I(idx) - (B(idx) + G(idx));
% Combine all three results into an RGB image. Clip to [0, 1] to
% compensate for floating-point arithmetic rounding effects.
rgb = cat(3, R, G, B);
rgb = max(min(rgb, 1), 0);
彩色图像处理细分成 3 个主要领域:
对于彩色图像,我们限定形式的变换: s i = T i ( r i ) {s_i=T_i(r_i)} si=Ti(ri)。 r i {r_i} ri和 s i {s_i} si是输入和输出图像的彩色分量, n {n} n是 r i {r_i} ri是彩色空间的维数, T i {T_i} Ti是全彩色变换(或叫映射)函数。
如果input image是单色的,公式为: s i = T i ( r ) {s_i=T_i(r)} si=Ti(r)。这里 r {r} r表示灰度级的值, n {n} n是在 s i {s_i} si中彩色分量的数量。
我们用两个线性滤波的例子说明彩色 图像的空间处理:图像平滑和图像锐化。
平滑单色图像的一种方法是定义相应的系数 是 1 的模板,用空间模板的系数去乘所有像素的值,并用模板中元素的总数去除。
令 c 代表 RGB 彩色空间中的任意向量:
c = [ c R c G c B ] = [ R G B ] c=\left[\begin{matrix}c_R\\c_G\\c_B\end{matrix}\right]=\left[\begin{matrix}R\\G\\B\end{matrix}\right] c=⎣⎡cRcGcB⎦⎤=⎣⎡RGB⎦⎤
c 分量是一副彩色图像在某个点上的 RGB 分量。考虑彩色分量是坐标的函数这样的事实,用下边的符号表示:
c ( x , y ) = [ c R ( x , y ) c G ( x , y ) c B ( x , y ) ] = [ R ( x , y ) G ( x , y ) B ( x , y ) ] c(x,y)=\left[\begin{matrix}c_R(x,y)\\c_G(x,y)\\c_B(x,y)\end{matrix}\right]=\left[\begin{matrix}R(x,y)\\G(x,y)\\B(x,y)\end{matrix}\right] c(x,y)=⎣⎡cR(x,y)cG(x,y)cB(x,y)⎦⎤=⎣⎡R(x,y)G(x,y)B(x,y)⎦⎤
令 S x y {S_{xy}} Sxy表示彩色图像中以(x,y)为中心的邻域的一组坐标。在该邻域中,RGB向量的平均值是:
c ˉ ( x , y ) = 1 K ∑ ( s , t ) ∈ S x y c ( s , t ) \bar{c}(x,y)=\frac{1}{K}\sum_{(s,t)\in S_{xy}}c(s,t) cˉ(x,y)=K1(s,t)∈Sxy∑c(s,t)
其中,K 是邻域中像素点的数量。附加向量的特性是:
c ˉ ( x , y ) = [ 1 K ∑ ( s , t ) ∈ S x y R ( s , t ) 1 K ∑ ( s , t ) ∈ S x y G ( s , t ) 1 K ∑ ( s , t ) ∈ S x y B ( s , t ) ] \bar{c}(x,y)=\left[\begin{matrix}\frac{1}{K}\sum_{(s,t)\in S_{xy}}R(s,t)\\\frac{1}{K}\sum_{(s,t)\in S_{xy}}G(s,t)\\\frac{1}{K}\sum_{(s,t)\in S_{xy}}B(s,t)\end{matrix}\right] cˉ(x,y)=⎣⎢⎡K1∑(s,t)∈SxyR(s,t)K1∑(s,t)∈SxyG(s,t)K1∑(s,t)∈SxyB(s,t)⎦⎥⎤
这个向量的每个分量都作为我们将要得到的结果,结果是用每个分量图像执行邻域平均获得的,这里使用的是上边提到的滤波器模板。
平滑 RGB 彩色图像fc时,线性空间滤波由下面的步骤组成:
因为可以在 MATLAB 中使用与单色图像相同的语法来执行 RGB 图像的线性滤波, 所以可以把前三步合并为一步。
>> % 分步进行
>> fr = fc(:,:,1);
>> fg = fc(:,:,2);
>> fb = fc(:,:,3);
>> fR_filtered = imfilter(fR, w, 'replicate');
>> fs_filtered = imfilter(fG, w, 'replicate');
>> fB_filtered = imfilter(fB, w, 'replicate');
>> fc_filtered = cat(3, fR_filtered, fG_filtered, fB_filtered);
>> % 合并为一步
>> fc_filtered = imfilter(fc, w, 'replicate');
Example Color image smoothing:
首先,读取一张RGB-Image,并显示R、G、B三通道的图像
>> fc = imread('Fig0622(a).tif');
>> subplot(221);imagesc(fc);title('RGB image');
>> subplot(222);imagesc(fc(:, :, 1));title('R');
>> subplot(223);imagesc(fc(:, :, 2));title('G');
>> subplot(224);imagesc(fc(:, :, 3));title('B');
然后,转换RGB为HSV-Image,并对亮度I通道做平滑处理
>> h = rgb2hsi(fc);
>> H = h(:, :, 1);
>> S = h(:, :, 2);
>> I = h(:, :, 3);
>> w = fspecial('average', 25);
>> I_filtered = imfilter(I, w, 'replicate');
>> h = cat(3, H, S, I_filtered);
>> f = hsi2rgb(h); % Back to RGB for comparison.
>> subplot(131);imagesc(H);title('H');
>> subplot(132);imagesc(S);title('S');
>> subplot(133);imagesc(I);title('I');
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNncgBar-1647138828492)(/Users/wanghe/Library/Application Support/typora-user-images/image-20211125224529874.png)]
>> fc_filtered = imfilter(fc, w, 'replicate');
>> h_filtered = imfilter(fc, w, 'replicate');
>> subplot(131);imagesc(fc_filtered);title('RGB-filtered');
>> subplot(132);imagesc(h);title('Intensity-filtered');
>> subplot(133);imagesc(h_filtered);title('HIS-filtered');
用线性空间滤波锐化一幅 RGB 图像遵循与前面相同的步骤,但是应使用锐化滤波器。我们采用拉普拉斯使图像锐化。
从向量分析中,我们知道向量的拉普拉斯被定义为矢量,它们的分量等于输入向量的分量的拉普拉斯。
在 RGB 彩色系统中,我们引入矢量c的拉普拉斯为:
∇ 2 [ c ( x , y ) ] = [ ∇ 2 R ( x , y ) ∇ 2 G ( x , y ) ∇ 2 B ( x , y ) ] \nabla^2[c(x,y)]=\left[\begin{matrix}\nabla^2R(x,y)\\\nabla^2G(x,y)\\\nabla^2B(x,y)\end{matrix}\right] ∇2[c(x,y)]=⎣⎡∇2R(x,y)∇2G(x,y)∇2B(x,y)⎦⎤
通过分别计算每个分量图像的拉普拉斯来计算 全彩图像的拉普拉斯。
Example Color image sharpening:
我们使用拉普拉斯滤波模板: [ 1 1 1 1 − 8 1 1 1 1 ] {\left[\begin{matrix}1&1&1\\1&-8&1\\1&1&1\end{matrix}\right]} ⎣⎡1111−81111⎦⎤
然后,显示拉普拉斯增强图像
>> fb = fc;
>> fb = tofloat(fb);
>> fen = fb - imfilter(fb, lapmask, 'replicate');
>> subplot(121);imshow(fb);title('RGB-Image');
>> subplot(122);imshow(fen);title('RGB-Shaepen-Image');
可以明显地看到,图 像在锐度特性上的显著加强,比如水滴、叶子上的纹路、花朵黄色的中心和前景中明显的绿色植物。
基于单独彩色平面的处理不等于直接在 RGB 矢量空间中进行的计算。
矢量空间处理的两个应用:彩色边缘检测和区域分割。
2D 函数 f(x,y)的梯度定义为如下矢量: ∇ f = [ g x g y ] = [ ∂ f ∂ x ∂ f ∂ y ] {\nabla f=\left[\begin{matrix}g_x\\g_y\end{matrix}\right]=\left[\begin{matrix}\frac{\partial f}{\partial x}\\\frac{\partial f}{\partial y}\end{matrix}\right]} ∇f=[gxgy]=[∂x∂f∂y∂f]
这个矢量的大小是: ∇ f = m a g ( ∇ f ⃗ ) = [ g x 2 + g y 2 ] 1 / 2 = [ ( ∂ f / ∂ x ) 2 + ( ∂ f / ∂ y ) 2 ] 1 / 2 {\nabla f=mag(\nabla\vec{f})=[g_x^2+g_y^2]^{1/2}=[(\partial f/\partial x)^2+(\partial f/\partial y)^2]^{1/2}} ∇f=mag(∇f)=[gx2+gy2]1/2=[(∂f/∂x)2+(∂f/∂y)2]1/2
这个数量用绝对值来近似: ∇ f ≈ ∣ g x ∣ + ∣ g y ∣ {\nabla f\approx |g_x|+|g_y|} ∇f≈∣gx∣+∣gy∣
这个近似值避免了平方和开方计算,但是仍然具有推导过的特性。在通常的应用中,把梯度的幅值简单地作为梯度。
梯度向量的基本特性是在 f 坐标(x, y)处指向最大变化率的方向。
最大变化率发生的角度是: α ( x , y ) = tan − 1 [ g x g y ] {\alpha(x,y)=\tan^{-1}\Big[\frac{g_x}{g_y}\Big]} α(x,y)=tan−1[gygx]
令 r、g 和 b 是 RGB 彩色空间沿 R、G、B 轴的单位矢量,定义矢量:KaTeX parse error: Undefined control sequence: \part at position 22: …ac{\partial R}{\̲p̲a̲r̲t̲ ̲x}r+\frac{\part…和KaTeX parse error: Undefined control sequence: \part at position 22: …ac{\partial R}{\̲p̲a̲r̲t̲ ̲y}r+\frac{\part…,根据这些矢量的点积,定义 g x x {g_{xx}} gxx、 g y y {g_{yy}} gyy和 g x y {g_{xy}} gxy:
KaTeX parse error: Undefined control sequence: \part at position 37: …Tu=\bigg|\frac{\̲p̲a̲r̲t̲ ̲R}{\part x}\big…
记住 R、G 和 B,因而 g 是 x 和 y 的函数。使用这种符号,可以说明——c(x,y)的最大变化 率方向将作为(x,y)函数由角度给出:
θ ( x , y ) = 1 2 tan − 1 [ 2 g x y g x x − g y y ] \theta(x,y)=\frac{1}{2}\tan^{-1}\bigg[\frac{2g_{xy}}{g_{xx}-g_{yy}}\bigg] θ(x,y)=21tan−1[gxx−gyy2gxy]
并且在该方向上,由 θ ( x , y ) {\theta(x,y)} θ(x,y)给出的变化率的值(例如梯度值)由下式给出:
F θ ( x , y ) = { 1 2 [ ( g x x + g y y ) + ( g x x − g y y ) cos 2 θ ( x , y ) + 2 g x y sin 2 θ ( x , y ) ] } 1 / 2 F_\theta(x,y)=\Bigg\{\frac{1}{2}\bigg[(g_{xx}+g_{yy})+(g_{xx}-g_{yy})\cos{2\theta(x,y)}+2g_{xy}\sin{2\theta(x,y)}\bigg]\Bigg\}^{1/2} Fθ(x,y)={21[(gxx+gyy)+(gxx−gyy)cos2θ(x,y)+2gxysin2θ(x,y)]}1/2
数组 θ ( x , y ) {\theta(x,y)} θ(x,y)和KaTeX parse error: Expected 'EOF', got '}' at position 15: cF_\theta(x,y)}̲是与输入图像尺寸相同的图像。 θ ( x , y ) {\theta(x,y)} θ(x,y)的元素是用于计算梯度的每个点的角度,并且 F θ ( x , y ) {F_\theta(x,y)} Fθ(x,y)是梯度图像。
上述方程提供了两个相隔 90°的值,这一事实意味着这个方程涉及每个点(x,y)的一对正交方向。沿着这些方向 F 是最大的,并且沿着另一个方向是最小的。所以,最后结果由选择的每个点上的最大值产生。
Example Detect the edge of RGB with function colorgrad:
>> fr = imread('Fig0627(a).tif');
>> fg = imread('Fig0627(b).tif');
>> fb = imread('Fig0627(c).tif');
>> f = cat(3, fr, fg, fb);
>> [VG, A, PPG] = colorgrad(f);
>> subplot(231);imshow(fr);axis off;
>> subplot(232);imshow(fg);axis off;
>> subplot(233);imshow(fb);axis off;
>> subplot(234);imshow(f);axis off;
>> subplot(235);imshow(VG);axis off;
>> subplot(236);imshow(PPG);axis off;
其中,PPG产生的边缘弱于VG。原因很简单:当蓝色平面的梯度产生单一水平边缘时,红色和绿色平面的梯度产生两个垂直边缘。为形成 PPG,相加这三个梯度将产生两倍于水平边缘亮度的垂直边缘。
另一方面,当彩色图像的梯度在向量空间中直接计算时,垂直和水平边缘的比值是 2 {\sqrt2} 2 而不是 2。原因也很简单:彩色图像的垂直边缘是在蓝白方块和黑黄方块之间。这些颜色在彩色立方体之间的距离是 2 {\sqrt2} 2,但是在黑蓝和黄白(水平边缘)之间的距离仅是1。这样,垂直和水平差别的比率是 2 {\sqrt 2} 2
分割是把一幅图像分成一些区域。分割的目的是对图像中的每个 RGB 像素进行分类,使之在指定的范围内有或没有一种颜色。
使用 RGB 彩色向量进行彩色区域分割是很简单的。假设目的是在 RGB 图像中分割某个特定彩色区域内的物体。给定一组感兴趣的有代表性的彩色(或彩色范围)样点,我们获得“平均”或期望的颜色估计,这是我们希望的分割。
让这个平均色用 RGB 向量 m 来定义,令 z 表示 RGB 空间的任意点。如果它们之间的距离小于指定的阈值 T,那么 z 相似于 m。z 和 m 之间的欧几里德距离由下式给出:
D ( z , m ) = ∣ ∣ z − m ∣ ∣ = [ ( z − m ) T ( z − m ) ] 1 / 2 = [ ( z R − m R ) 2 + ( z G − m G ) 2 + ( z B − m B ) 2 ] 1 / 2 \begin{aligned} D(z,m)&=||z-m||\\ &=[(z-m)^T(z-m)]^{1/2}\\ &=[(z_R-m_R)^2+(z_G-m_G)^2+(z_B-m_B)^2]^{1/2} \end{aligned} D(z,m)=∣∣z−m∣∣=[(z−m)T(z−m)]1/2=[(zR−mR)2+(zG−mG)2+(zB−mB)2]1/2
上述方程的有用归纳是距离度量形式: D ( z , m ) = [ ( z − m ) T C − 1 ( z − m ) ] 1 / 2 {D(z,m)=[(z-m)^TC^{-1}(z-m)]^{1/2}} D(z,m)=[(z−m)TC−1(z−m)]1/2, C {C} C是我们要分割的有代表性彩色样值的协方差矩阵。