图像的模糊特征平面:假设原始图像为 I ( x , y ) I(x,y) I(x,y),其中 x x x 和 y y y 分别表示图像的水平和垂直方向的坐标。模糊特征平面可以表示为 B ( x , y , θ ) B(x,y,\theta) B(x,y,θ),其中 θ \theta θ 是一个旋转角度参数,表示模糊核函数的旋转角度。 B ( x , y , θ ) B(x,y,\theta) B(x,y,θ) 表示在 ( x , y ) (x,y) (x,y) 处应用旋转角度为 θ \theta θ 的模糊核函数时得到的图像模糊程度
通常,模糊核函数可以表示为 h ( x , y , θ ) h(x,y,\theta) h(x,y,θ),其中 ( x , y ) (x,y) (x,y) 表示模糊核函数中心的坐标, θ \theta θ 表示旋转角度。那么,模糊特征平面可以通过将原始图像 I ( x , y ) I(x,y) I(x,y) 和模糊核函数 h ( x , y , θ ) h(x,y,\theta) h(x,y,θ) 卷积得到
B ( x , y , θ ) = I ( x , y ) ∗ h ( x , y , θ ) B(x,y,\theta)=I(x,y)*h(x,y,\theta) B(x,y,θ)=I(x,y)∗h(x,y,θ)
在实际应用中,模糊特征平面常常被用来进行图像识别和分类等任务,因为它可以帮助我们理解和描述图像模糊程度的特征
算法步骤:
①:将图像从空间灰度域变换到模糊域
μ m n = T ( x m n ) = [ 1 + x max − x m n F d ] − F e \mu_{m n}=T\left(x_{m n}\right)=\left[1+\frac{x_{\max }-x_{m n}}{F_{d}}\right]^{-F_{e}} μmn=T(xmn)=[1+Fdxmax−xmn]−Fe
②:在模糊域,对模糊特征进行一定的增强
{ μ m n ′ = I r ( μ m u ) = { 2 μ m u 2 , 0 ≤ μ m n < 0.5 1 − 2 ( 1 − μ m u ) 2 , 0.5 ≤ μ m u < 1 I r ( μ m n ) = I 1 ( I r − 1 ( μ m u ) ) \left\{\begin{array}{ll}\mu_{m n}^{\prime}=I_{r}\left(\mu_{m u}\right)=\left\{\begin{array}{cl}2 \mu_{m u}^{2}, & 0 \leq \mu_{m n}<0.5 \\1-2\left(1-\mu_{m u}\right)^{2}, & 0.5 \leq \mu_{m u}<1\end{array}\right. \\I_{r}\left(\mu_{m n}\right)=I_{1}\left(I_{r-1}\left(\mu_{m u}\right)\right)\end{array}\right. ⎩ ⎨ ⎧μmn′=Ir(μmu)={2μmu2,1−2(1−μmu)2,0≤μmn<0.50.5≤μmu<1Ir(μmn)=I1(Ir−1(μmu))
③:逆变换后,得到新的模糊增强后的输出图像
z m n = I − 1 ( μ m n ′ ) = x max − F d [ ( μ m n ′ ) 1 F e − 1 ] z_{m n}=I^{-1}\left(\mu_{m n}^{\prime}\right)=x_{\max }-F_{d}\left[\left(\mu_{m n}^{\prime}\right)^{\frac{1}{F_{e}}}-1\right] zmn=I−1(μmn′)=xmax−Fd[(μmn′)Fe1−1]
matlab实现
Image=imread('Beautiful.jpg');
[height width]=size(Image);
Image=double(Image); xmax=max(max(Image));
xc=mean2(Image);
Fe=2; Fd=(xmax-xc)/(2^(1/Fe)-1);
u=(1+(xmax-Image)/Fd).^(-Fe);
times=2; %设置迭代次数
for k=1:times
for i=1:height
for j=1:width
if u(i,j)<0.5
u(i,j)=2*u(i,j)^2;
else
u(i,j)=1-2*(1-u(i,j))^2;
end
end
end
end
NewImage=xmax-Fd.*(u.^(-1/Fe)-1);
figure;imshow(uint8(NewImage));title('基于模糊技术的增强');
Python实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读入图像
image = cv2.imread('Beautiful.jpg', cv2.IMREAD_GRAYSCALE)
# 获取图像高度和宽度
height, width = image.shape
# 将图像转换为浮点数类型
image = image.astype(float)
# 计算最大灰度值和图像的均值
xmax = np.max(image)
xc = np.mean(image)
# 计算 Fe 和 Fd
Fe = 2
Fd = (xmax - xc) / (2 ** (1 / Fe) - 1)
# 计算模糊增强函数
u = (1 + (xmax - image) / Fd) ** (-Fe)
# 设置迭代次数
times = 2
# 迭代更新模糊增强函数
for k in range(times):
for i in range(height):
for j in range(width):
if u[i, j] < 0.5:
u[i, j] = 2 * u[i, j] ** 2
else:
u[i, j] = 1 - 2 * (1 - u[i, j]) ** 2
# 计算增强后的图像
new_image = xmax - Fd * ((u) ** (-1 / Fe) - 1)
# 显示增强后的图像
plt.imshow(new_image.astype(np.uint8), cmap='gray')
plt.title('基于模糊技术的增强')
plt.show()
真彩色:是一种能够显示全部或大部分人类可见光谱的图像呈现方式。在数码摄影、计算机图形学和显示技术中,具有真彩色的图像通常由红、绿和蓝三种原色光以不同强度的组合来呈现,每种原色的强度值用 8 位二进制数存储,因此在每个像素点上可以存储更精细的颜色信息,呈现出更真实的颜色
假彩色:是指在图像处理中为了突出某些特定的信息或者达到某种目的而对图像进行的一种虚构的颜色着色方式,一般来说,这种颜色表示方式是人为设定的,不一定与真实颜色有任何关系。例如,在地球观测中,有时使用假彩色来表示不同种类的地物或者地表特征,如植被、水域、城市等,这样可以更清晰地区分不同的地物或者地表特征
伪彩色:每个像素的颜色不是由每个基色分量的数值直接决定的,而是把像素值当作彩色查找表(CLUT)的表项入口地址,去查找一个显示图像时使用的R,G,B强度值,用查找出的R,G,B强度值产生的彩色称为伪彩色。彩色查找表CLUT是一个事先做好的表,表项入口地址也称为索引号。例如16种颜色的查找表,0号索引对应黑色,15号索引对应白色
通俗易懂地说,伪彩色就是在黑白灰度图像的基础上,通过颜色的变化突出图像的特定信息。例如,一张黑白皱巴巴的纸看上去可能很普通,但如果将图像变换成伪彩色,加入颜色的更丰富表现,则可能会呈现出更多的信息。同样,对于一张医学图像,通过伪彩色的增强方式,就能凸显出人体不同器官或疾病的具体位置和特征
假设我们想在地图上显示不同地区的温度,我们可以把地图上的温度数据叠加为灰度图像,此时较暗的区域代表温度比较低、较亮的区域温度比较高。这样的表示其实有一定缺陷,第一个原因人类视觉系统对灰度强度的变化不灵敏,能够区分的灰度级一般只有二十几个,而对不同亮度和色调的彩色图像的分辨力能力却可以达到灰度分辨能力的数百倍以上;第二个原因是因为我们可以用不同的颜色代表不同的意义,比如用蓝色代表温度较低、红色代表温度较高
因此彩色增强处理图像的主要目的是为了改善图像的视觉效果和识别能力。对于很多实际应用中的图像,例如医学影像、卫星遥感图像等,单纯的灰度图像可能不足以满足人类视觉的需求,而加入彩色信息则可以让图像更容易被人眼识别和理解。具体来说,彩色增强处理图像具有以下好处:
彩色增强在图像增强中应用十分广泛,常见的彩色增强技术主要分为如下两类:
伪彩色增强基本原理:伪彩色增强是一种将灰度图像转化为彩色图像的方法,它的基本原理是将灰度图像中的每个像素的灰度值映射到一个伪彩色表(也称为颜色映射表)上,从而生成一张带有伪彩色的图像。通常情况下,伪彩色表会根据不同的应用需求而定制,以达到最佳的图像增强效果
% 读入卫星图
I = imread(SatelliteMap.jpg);
% 定义颜色映射
map = jet(256);
% 将灰度图像转换为伪彩色图像
PesudoImage) = ind2rgb(I, map);
% 显示伪彩色图像
subplot(1,2,1),imshow(I),title('原图');
subplot(1,2,2),imshow(PesudoImage),title('伪彩色图');
密度分割法:这是伪彩色处理技术中最基本、最简单的一种方法。该方法的主要原理是将输入图像的灰度值分成若干个密度区间,每个密度区间分配一种颜色,生成一副带有伪彩色的图像。如下图,设一幅灰度图像 f ( x , y ) f(x,y) f(x,y)可以看作坐标 ( x , y ) (x,y) (x,y)的一个密度函数,把此图像的灰度分为若干区间,即相当于用一些和坐标平面平行的平面在相交区域切割此密度函数
实现如下效果
matlab实现:
clear all;close all;
I = double(rgb2gray(imread('feibu.png')));
[M N] = size(I);
I2 = zeros(M, N, 3); %初始化三通道
for x = 1 : M
for y = 1 : N
if I(x, y) <= 127 % R
I2(x, y, 1) = 0;
elseif I(x, y) <= 191
I2(x, y, 1) = 4 * I(x, y) - 510;
else
I2(x, y, 1) = 255;
end
if I(x, y) <= 63 % G
I2(x, y, 2) = 254 - 4 * I(x, y);
elseif I(x, y) <= 127
I2(x, y, 2) = 4 * I(x, y) - 254;
elseif I(x, y) <= 191
I2(x, y, 2) = 255;
else
I2(x, y, 2) = 1022 - 4 * I(x, y);
end
if I(x, y) <= 63 % B
I2(x, y, 3) = 255;
elseif I(x, y) <= 127
I2(x, y, 3) = 510 - 4 * I(x, y);
else
I2(x, y, 3) = 0;
end
end
end
imshow(uint8(I2));
Python实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
I = cv2.imread('feibu.png', cv2.IMREAD_GRAYSCALE)
M, N = I.shape
# 初始化三通道
I2 = np.zeros((M, N, 3), dtype=np.float32)
# RGB 转换
for x in range(M):
for y in range(N):
if I[x, y] <= 127: # R
I2[x, y, 0] = 0
elif I[x, y] <= 191:
I2[x, y, 0] = 4 * I[x, y] - 510
else:
I2[x, y, 0] = 255
if I[x, y] <= 63: # G
I2[x, y, 1] = 254 - 4 * I[x, y]
elif I[x, y] <= 127:
I2[x, y, 1] = 4 * I[x, y] - 254
elif I[x, y] <= 191:
I2[x, y, 1] = 255
else:
I2[x, y, 1] = 1022 - 4 * I[x, y]
if I[x, y] <= 63: # B
I2[x, y, 2] = 255
elif I[x, y] <= 127:
I2[x, y, 2] = 510 - 4 * I[x, y]
else:
I2[x, y, 2] = 0
# 显示图像
I2 = I2.astype(np.uint8)
plt.imshow(I2)
plt.show()
彩色变换法:这种变换方法是对输入图像的灰度值实现3种独立变换,按灰度值映射成不同大小的红、绿、蓝三基色值。然后,同他们分别去控制彩色显示器的红、绿、蓝电子枪,以产生相应的彩色显示
实现如下效果
matlab实现:
clc; % 清空命令窗口
% 读取名为feibu.png的图像并转换为灰度图像
I=imread('feibu.png');
I=rgb2gray(I);
% 显示灰度图像
figure(1),imshow(I);
% 将灰度图像转换为double类型的数组,并获取图像的尺寸和灰度级数
I=double(I);
[M,N]=size(I);
L=256;
% 使用双重循环遍历每个像素,并根据其灰度级别进行处理,生成伪彩色图像
for i=1:M
for j=1:N
if I(i,j)<=L/4
R(i,j)=0;
G(i,j)=4*I(i,j);
B(i,j)=L;
elseif I(i,j)<=L/2
R(i,j)=0;
G(i,j)=L;
B(i,j)=-4*I(i,j)+2*L;
elseif I(i,j)<=3*L/4
R(i,j)=4*I(i,j)-2*L;
G(i,j)=L;
B(i,j)=0;
else
R(i,j)=L;
G(i,j)=-4*I(i,j)+4*L;
B(i,j)=0;
end
end
end
% 使用双重循环遍历每个像素,并将伪彩色值存储到OUT数组中
for i=1:M
for j=1:N
OUT(i,j,1)=R(i,j);
OUT(i,j,2)=G(i,j);
OUT(i,j,3)=B(i,j);
end
end
% 将OUT数组的值除以256,生成0到1之间的浮点数,用于显示伪彩色图像
OUT=OUT/256;
% 显示伪彩色图像
figure(2),imshow(OUT)
Python实现:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取名为feibu.png的图像并转换为灰度图像
img = cv2.imread('feibu.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 显示灰度图像
plt.figure()
plt.imshow(gray, cmap='gray')
# 将灰度图像转换为double类型的数组,并获取图像的尺寸和灰度级数
gray = gray.astype(np.float64)
M, N = gray.shape
L = 256
# 使用双重循环遍历每个像素,并根据其灰度级别进行处理,生成伪彩色图像
R, G, B = np.zeros_like(gray), np.zeros_like(gray), np.zeros_like(gray)
for i in range(M):
for j in range(N):
if gray[i,j] <= L/4:
R[i,j] = 0
G[i,j] = 4 * gray[i,j]
B[i,j] = L
elif gray[i,j] <= L/2:
R[i,j] = 0
G[i,j] = L
B[i,j] = -4 * gray[i,j] + 2 * L
elif gray[i,j] <= 3 * L/4:
R[i,j] = 4 * gray[i,j] - 2 * L
G[i,j] = L
B[i,j] = 0
else:
R[i,j] = L
G[i,j] = -4 * gray[i,j] + 4 * L
B[i,j] = 0
# 将RGB数组沿第三个轴合并为单个数组
out = np.dstack((R, G, B))
# 将OUT数组的值除以256,生成0到1之间的浮点数,用于显示伪彩色图像
out = out / 256.0
# 显示伪彩色图像
plt.figure()
plt.imshow(out)
plt.show()
频域伪彩色处理:频率域伪彩色增强时,先把灰度图像(,)中的不同频率成分经傅里叶变换(FFT)到频率域。类似于灰度变换法,对对三种独立分量进行滤波,接着进行傅里叶逆变换(IFFT)得到三幅代表不同频率分量的单色图像,接着对他们进行附加处理,最后将三基色加载到彩色显示器的红、绿、蓝显示通道
通常情况,每个滤波器的滤波性能不一样,典型的处理方法是采用低通、带通、高通三种滤波器把图像分成低频、中频、高频三个频域分量,然后分别给予不同的三基色
实现如下效果
matlab实现:
clc;
I=imread('feibu.png'); % 读取名为“feibu.png”的图像,并将其赋值给变量I
I=rgb2gray(I); % 将I从RGB格式转换为灰度格式
figure(1),imshow(I);
[M,N]=size(I); % 获取灰度图像的尺寸,分别赋值给变量M和N
F=fft2(I); % 对灰度图像进行二维傅里叶变换,得到其频率域表示
fftshift(F); % 对傅里叶变换结果进行移位操作,将其零频分量移到中心位置
REDcut=100; % 设置红色通道的高频截止频率
GREENcut=200; % 设置绿色通道的低频截止频率
BLUEcenter=150; % 设置蓝色通道的带通中心频率
BLUEwidth=100; % 设置蓝色通道的带宽
BLUEu0=10; % 设置蓝色通道的带通中心频率在频域上的横坐标
BLUEv0=10; % 设置蓝色通道的带通中心频率在频域上的纵坐标
% 对每个频率分量进行处理,计算三个颜色通道的频率响应
for u=1:M
for v=1:N
D(u,v)=sqrt(u^2+v^2); % 计算当前频率分量的频率值
REDH(u,v)=1/(1+(sqrt(2)-1)*(D(u,v)/REDcut)^2); % 计算红色通道的频率响应
GREENH(u,v)=1/(1+(sqrt(2)-1)*(GREENcut/D(u,v))^2); % 计算绿色通道的频率响应
BLUED(u,v)=sqrt((u-BLUEu0)^2+(v-BLUEv0)^2);
BLUEH(u,v)=1-1/(1+BLUED(u,v)*BLUEwidth/((BLUED(u,v))^2-(BLUEcenter)^2)^2); % 计算蓝色通道的频率响应
end
end
RED=REDH.*F; % 对红色通道的频率响应与图像频率域表示进行点乘
REDcolor=ifft2(RED); % 对点乘结果进行傅里叶逆变变换,得到红色通道的空间域表示
GREEN=GREENH.*F;
GREENcolor=ifft2(GREEN);
BLUE=BLUEH.*F;
BLUEcolor=ifft2(BLUE);
REDcolor=real(REDcolor)/256;
GREENcolor=real(GREENcolor)/256;
BLUEcolor=real(BLUEcolor)/256;
for i=1:M
for j=1:N
OUT(i,j,1)=REDcolor(i,j);
OUT(i,j,2)=GREENcolor(i,j);
OUT(i,j,3)=BLUEcolor(i,j);
end
end
OUT=abs(OUT);
figure,imshow(OUT);
Python实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取图像
I = cv2.imread('feibu.png')
# 将图像从RGB格式转换为灰度格式
I = cv2.cvtColor(I, cv2.COLOR_BGR2GRAY)
# 显示灰度图像
plt.figure()
plt.imshow(I, cmap='gray')
# 获取灰度图像的尺寸
M, N = I.shape
# 对灰度图像进行二维傅里叶变换,得到其频率域表示
F = np.fft.fft2(I)
# 对傅里叶变换结果进行移位操作,将其零频分量移到中心位置
F = np.fft.fftshift(F)
# 设置红色通道的高频截止频率
REDcut = 100
# 设置绿色通道的低频截止频率
GREENcut = 200
# 设置蓝色通道的带通中心频率
BLUEcenter = 150
# 设置蓝色通道的带宽
BLUEwidth = 100
# 设置蓝色通道的带通中心频率在频域上的横坐标
BLUEu0 = 10
# 设置蓝色通道的带通中心频率在频域上的纵坐标
BLUEv0 = 10
# 对每个频率分量进行处理,计算三个颜色通道的频率响应
for u in range(M):
for v in range(N):
# 计算当前频率分量的频率值
D = np.sqrt((u - M/2)**2 + (v - N/2)**2)
# 计算红色通道的频率响应
REDH = 1 / (1 + (np.sqrt(2) - 1) * ((D / REDcut) ** 2))
# 计算绿色通道的频率响应
GREENH = 1 / (1 + (np.sqrt(2) - 1) * ((GREENcut / D) ** 2))
# 计算蓝色通道的频率响应
BLUED = np.sqrt((u - BLUEu0)**2 + (v - BLUEv0)**2)
BLUEH = 1 - 1 / (1 + (BLUED * BLUEwidth / ((BLUED ** 2) - (BLUEcenter ** 2))) ** 2)
BLUEH = np.nan_to_num(BLUEH, nan=1)
# 对红色通道的频率响应与图像频率域表示进行点乘
F[u, v] = REDH * F[u, v], GREENH * F[u, v], BLUEH * F[u, v]
# 对点乘结果进行傅里叶逆变变换,得到彩色图像的空间域表示
out = np.fft.ifft2(F)
# 分离三个颜色通道,并将其缩放到0-1之间
red = np.real(out[:, :, 0])
总结:伪彩色图像增强是将灰度图像通过将不同的灰度级别映射到不同的颜色上,生成伪彩色图像的一种方法。它主要应用于图像处理、计算机视觉和医学影像处理等领域。通过将灰度图像转换为彩色图像,可以更加直观地观察图像中的细节,使得图像在视觉上更具吸引力和易于理解
目前,伪彩色图像增强方面的研究主要集中在以下几个方面