数字图像处理MATLAB学习笔记(五)
数字图像处理MATLAB学习笔记(五)
Color Image Processing
1 Color Image Representation in MATLAB
这里不多说了,彩色图片在计算机中以R、G、B三通道存储。也就是说,读取一个彩色图片,会生成一个M×N×3{M\times N\times 3}M×N×3的matrix。
1.1 Indexed Images
索引图像有两个分量:整数数据矩阵 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)
- 在第一个函数中,使用的是最小方差量化法加入抖动对RGB图像进行转换,量化颜色种类数为Q
- 在第二个函数中,使用均匀量化法加入抖动对RGB图像进行转换,tol为容差
- 第三个函数中,使用逆颜色图算法加入抖动对RGB图像进行转换,指定颜色map为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 类。
1.2 Functions for Manipulating RGB and Indexed Images
下表是有关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赋阈值
1n,2n,…,n−1n\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,抖动处理可以通过“随机性”的结果,缓解图像量化时产生的伪轮廓现象;抖动处理的效果用灰度图像来说明往往更好,因为转化为二值图像,数据量显著减少
2 Converting Between Color Spaces
RGB 只是一种彩色空间,当然还有其他的彩色空间(又被称作彩色模型),它们在应用中的使用可能比 RGB 更方便 或更恰当。这些模型是 RGB 模型的变换,包括 NTSC、YCbCr、HSV、CMY、CMYK 和 HSI 彩色空间。
2.1 NTSC Color Space
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)代表饱和度。
2.2 YCbCr Color Space
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)
2.3 HSV Color Space
HSV(hue色调、saturation饱和度、value值/明亮度)比 RGB 系统更接近人们的经验和对彩色的感知。通常V的优先级要大于S的优先级。
- 色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
- 饱和度S:饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
- 明度V:明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
HSV彩色空间可以通过从RGB彩色立方体沿灰度轴(连接黑色顶点和白色顶点的轴)用公式来表达。V=0,轴的末端为黑色;V=1,轴的末端为白色。
HSV与RGB分量的关系为:
HSV−>RGB: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)0≤H<60∘(X,C,0)60∘≤H<120∘(0,C,X)120∘≤H<180∘(0,X,C)180∘≤H<240∘(X,0,C)240∘≤H<300∘(C,0,X)300∘≤H<360∘(R,G,B)=((R′+m)×255,(G′+m)×255,(B′+m)×255)RGB−>HSV: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∘Δ=060∘×(G′−B′Δmod6)Cmax=R′60∘×(B′−R′Δmod6)Cmax=R′60∘×(R′−G′Δmod6)Cmax=R′Saturation calculation:S={0Cmax=0ΔCmaxCmax≠0Value calculation:V=Cmax\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)
2.4 The CMY and CMYK Color Space
青色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)
2.5 HSI Color Space
HSI(hue色调、saturation饱和度、Intensity强度),该模型将强度分量与从一幅彩 色图像中承载的彩色信息分开。较为理想。
2.5.1 RGB转换为HSI
假定RGB值已经归一化在[0,1]之间,角度θ{\theta}θ使用关于HSI空间的红轴来度量。
将从H的公式中得出的所有结果除以360°,即可将色调归一化在[0,1]之间。
转换关系有:
Hue calculation:H={θB≤G360−θ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−3R+G+B[min(R,G,B)]Intensity calculation:I=13(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)
2.5.2 HSI转换为RGB
给定在[0,1]之间的 HSI 值,我们现在希望找出同一范围内相应的 RGB 值。
这里不要忘记对H乘上360,因为在做rgb2hsi时为实现H的归一化,我们最终输出H是除以了360,所以这里再编程时要记得乘回来。
转换关系有:
R,G,B={I[1+ScosHcos(60∘−H)]3I−(R+B)I(1−S)0∘≤H<120∘I(1−S)I[1+ScosHccos(180∘−H)]3I−(R+G)120∘≤H<240∘3I−(B+G)I(1−S)I[1+ScosH−240∘cos(300∘−H)]240∘≤H<360∘\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∘
2.5.3 Function rgb2hsi and Function hsi2rgb
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 The Basics of Color Image Processing
彩色图像处理细分成 3 个主要领域:
- 颜色变换(也叫彩色映射):以像素值为基础,处理每个彩色平面的像素
- 单独彩色平面的空间处理:涉及各个彩色平面的空间(邻域)滤波
- 颜色向量的处理:涉及以同时处理彩色图像的所有分量为基础的处理技术
4 Color Transformation
对于彩色图像,我们限定形式的变换:si=Ti(ri){s_i=T_i(r_i)}si=Ti(ri)。ri{r_i}ri和si{s_i}si是输入和输出图像的彩色分量,n{n}n是ri{r_i}ri是彩色空间的维数,Ti{T_i}Ti是全彩色变换(或叫映射)函数。
如果input image是单色的,公式为:si=Ti(r){s_i=T_i(r)}si=Ti(r)。这里r{r}r表示灰度级的值,n{n}n是在si{s_i}si中彩色分量的数量。
5 Spatial Filtering of Color Images
我们用两个线性滤波的例子说明彩色 图像的空间处理:图像平滑和图像锐化。
5.1 Color Images Smoothing
平滑单色图像的一种方法是定义相应的系数 是 1 的模板,用空间模板的系数去乘所有像素的值,并用模板中元素的总数去除。
令 c 代表 RGB 彩色空间中的任意向量:
c=[cRcGcB]=[RGB]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)=[cR(x,y)cG(x,y)cB(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)⎦⎤
令Sxy{S_{xy}}Sxy表示彩色图像中以(x,y)为中心的邻域的一组坐标。在该邻域中,RGB向量的平均值是:
cˉ(x,y)=1K∑(s,t)∈Sxyc(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)=[1K∑(s,t)∈SxyR(s,t)1K∑(s,t)∈SxyG(s,t)1K∑(s,t)∈SxyB(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时,线性空间滤波由下面的步骤组成:
- 抽取 3 个分量图像
- 分别过滤每个分量图像
- 重建滤波过的RGB图像
因为可以在 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');
5.2 Color Images Sharpening
用线性空间滤波锐化一幅 RGB 图像遵循与前面相同的步骤,但是应使用锐化滤波器。我们采用拉普拉斯使图像锐化。
从向量分析中,我们知道向量的拉普拉斯被定义为矢量,它们的分量等于输入向量的分量的拉普拉斯。
在 RGB 彩色系统中,我们引入矢量c的拉普拉斯为:
∇2[c(x,y)]=[∇2R(x,y)∇2G(x,y)∇2B(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:
我们使用拉普拉斯滤波模板:[1111−81111]{\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');
可以明显地看到,图 像在锐度特性上的显著加强,比如水滴、叶子上的纹路、花朵黄色的中心和前景中明显的绿色植物。
6 Working Directly in RGB Vector Space
基于单独彩色平面的处理不等于直接在 RGB 矢量空间中进行的计算。
矢量空间处理的两个应用:彩色边缘检测和区域分割。
6.1 Color Edge Detection Using the Gradient
2D 函数 f(x,y)的梯度定义为如下矢量:∇f=[gxgy]=[∂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=mag(∇f⃗)=[gx2+gy2]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≈∣gx∣+∣gy∣{\nabla f\approx |g_x|+|g_y|}∇f≈∣gx∣+∣gy∣
这个近似值避免了平方和开方计算,但是仍然具有推导过的特性。在通常的应用中,把梯度的幅值简单地作为梯度。
梯度向量的基本特性是在 f 坐标(x, y)处指向最大变化率的方向。
最大变化率发生的角度是:α(x,y)=tan−1[gxgy]{\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…,根据这些矢量的点积,定义gxx{g_{xx}}gxx、gyy{g_{yy}}gyy和gxy{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)=12tan−1[2gxygxx−gyy]\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)={12[(gxx+gyy)+(gxx−gyy)cos2θ(x,y)+2gxysin2θ(x,y)]}1/2F_\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
6.2 Image Segmentation in RGB Vector Space
分割是把一幅图像分成一些区域。分割的目的是对图像中的每个 RGB 像素进行分类,使之在指定的范围内有或没有一种颜色。
使用 RGB 彩色向量进行彩色区域分割是很简单的。假设目的是在 RGB 图像中分割某个特定彩色区域内的物体。给定一组感兴趣的有代表性的彩色(或彩色范围)样点,我们获得“平均”或期望的颜色估计,这是我们希望的分割。
让这个平均色用 RGB 向量 m 来定义,令 z 表示 RGB 空间的任意点。如果它们之间的距离小于指定的阈值 T,那么 z 相似于 m。z 和 m 之间的欧几里德距离由下式给出:
D(z,m)=∣∣z−m∣∣=[(z−m)T(z−m)]1/2=[(zR−mR)2+(zG−mG)2+(zB−mB)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)TC−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是我们要分割的有代表性彩色样值的协方差矩阵。
数字图像处理MATLAB学习笔记(五)相关推荐
- 数字图像处理MATLAB学习笔记(一)
数字图像处理MATLAB学习笔记(一) 灰度转换与空间滤波 本节主要使用Matlab语言进行灰度转换与空间滤波的使用 并对相关数学原理进行总结 1. Intensity Transformer Fun ...
- 冈萨雷斯《数字图像处理》学习笔记(4)--图像复原与重建(含傅里叶切片定理推导)
一.图像复原模型 若H是线性的,空间不变的过程,则退化图像在空间域通过下式给出: g(x,y)=h(x,y)∗f(x,y)+δ(x,y)g(x,y)=h(x,y)*f(x,y)+\delta(x,y) ...
- 冈萨雷斯《数字图像处理》学习笔记(五)图像复原
目录 一.图像复原 二.噪声模型 三.只存在噪声的图像复原 空间滤波 频率域滤波消除周期噪声 四.退化函数的估计 退化函数 五.逆滤波(去卷积) 六.图像的几何变换 一.图像复原 图像复原的一般过程: ...
- 冈萨雷斯《数字图像处理》学习笔记(六)彩色图像处理
目录 一.彩色基础 二.彩色模型 三.色彩转换 四.彩色图像处理基础 五.彩色图像处理 六.彩色图像的噪声 七.彩色图像的压缩 附加知识点 一.彩色基础 彩色定义:彩色是物体的一种属性,他依赖于一下三 ...
- 冈萨雷斯《数字图像处理》学习笔记(七)小波变换和多分辨率处理
序言 什么是小波 "小波"(wavelet)就是一种"尺度"很小的波动,并具有时间和频率特性 小波函数必须满足以下两个条件: (1)小波必须是振荡的: (2)小 ...
- 冈萨雷斯《数字图像处理》学习笔记(九)形态学图像处理
目录 序言 一.集合论基础 1.集合的子集与相等 2.集合的基本运算符 3.集合的反射和平移 二.二值形态学的基本运算 1.腐蚀 2.膨胀 3.膨胀与腐蚀运算的对偶性 3.开运算与闭运算 4.一些基本 ...
- 冈萨雷斯《数字图像处理》学习笔记(八)图像压缩
目录 一.图像压缩基本概念 1.图像压缩的可能性 2.图像压缩的可能性 二.图像压缩模型 三.信息论要素 四.无损压缩和有损压缩 五.有损压缩 1.有损预测编码 (1)有损压缩的基本概念 (2)量化器 ...
- 《数字图像处理》学习笔记(四)--混合空间增强法(待修改)
这次试验问题很多,应该还是数据格式的问题,先发上来吧,放假回去先用Matlab做下,再改改..... 下面对一幅人体骨骼扫描图进行混合空间增强(有点吓人)...我们的目标是通过图像锐化突出骨骼的更多细 ...
- KLT到DCT(杜克大学数字图像处理课程学习笔记)
在上网课时KL变换的讲授稍微有点绕,所以卡了好几天,个人感觉理解了,所以做一下记录,当然由于这个只是课程需要所以没有涉及整块的原理,如果需要还请看其他大神的数学原理解释 简单来讲,在不考虑中间量化的步 ...
最新文章
- 链表问题2——在双链表中删除倒数第K个节点
- [书目]软件制胜之道:执行的策略
- minimun-depth-of-binary-tree
- matlab做TSP,基于matlab TSP问题遗传算法的实现
- ubuntu远程连接windows工具rdesktop
- 关于禁止svn客户端长驻内存的方法
- 网上购物软件的测试计划,网上购物平台购物测试计划书
- android 显示canvas,【报Bug】部分情况下,安卓canvas不显示
- 年审是当月还是当天_汽车年检提前检车的日期是按原始的还是按检车当月的?...
- 2018年软件评测师备考之路
- 联想计算机如何设置bios密码,联想bios网络管理员密码的设置方法
- 智能交通中的若干科学和技术问题
- 空手套白狼之——兼职中介
- 青龙面板 企业微信应用推送
- Html 用户反馈界面
- 轩辕实验室丨基于信息熵的车载网络流量异常检测防御方法
- 如何换ionic里面的图标
- EChat(简易聊天项目)一、登录注册实现
- ASP.NET MVC中的身份验证
- 16代表啥_形势严峻下的医药代表如何不被淘汰