当前位置:   article > 正文

(数字图像处理MATLAB+Python)第五章图像增强-第四、五节:基于模糊技术和基于伪彩色处理的图像增强_频域伪彩色增强原理

频域伪彩色增强原理

一:基于模糊技术的图像增强

(1)图像的模糊特征平面

图像的模糊特征平面:假设原始图像为 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,θ)

在实际应用中,模糊特征平面常常被用来进行图像识别和分类等任务,因为它可以帮助我们理解和描述图像模糊程度的特征

(2)算法步骤

算法步骤

①:将图像从空间灰度域变换到模糊域

  • F e F_{e} Fe为指数模糊因子。一般情况下, F e F_{e} Fe取值为2
  • F d F_{d} Fd为分数模糊因子,定义为 F d = x max ⁡ − x c 2 1 / F e − 1 F_{d}=\frac{x_{\max }-x_{c}}{2^{1 / F_{e}}-1} Fd=21/Fe1xmaxxc,其中 x c x_{c} xc为过渡点,其取值需要满足 μ c = T ( x c ) = 0.5 \mu_{c}=T(x_{c})=0.5 μc=T(xc)=0.5 x c ∈ X x_{c}\in X xcX

μ 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+Fdxmaxxmn]Fe

②:在模糊域,对模糊特征进行一定的增强

  • μ m n ′ \mu^{\prime}_{mn} μmn为增强后的模糊域像素灰度值
  • r r r为正整数,表示迭代次数

{ μ 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}

\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,12(1μmu)2,0μmn<0.50.5μmu<1Ir(μmn)=I1(Ir1(μ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=I1(μmn)=xmaxFd[(μmn)Fe11]

(3)程序

在这里插入图片描述


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('基于模糊技术的增强');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

二:基于伪彩色处理的图像增强

(1)真彩色、假彩色和伪彩色

真彩色:是一种能够显示全部或大部分人类可见光谱的图像呈现方式。在数码摄影、计算机图形学和显示技术中,具有真彩色的图像通常由红、绿和蓝三种原色光以不同强度的组合来呈现,每种原色的强度值用 8 位二进制数存储,因此在每个像素点上可以存储更精细的颜色信息,呈现出更真实的颜色

在这里插入图片描述

假彩色:是指在图像处理中为了突出某些特定的信息或者达到某种目的而对图像进行的一种虚构的颜色着色方式,一般来说,这种颜色表示方式是人为设定的,不一定与真实颜色有任何关系。例如,在地球观测中,有时使用假彩色来表示不同种类的地物或者地表特征,如植被、水域、城市等,这样可以更清晰地区分不同的地物或者地表特征

在这里插入图片描述

伪彩色:每个像素的颜色不是由每个基色分量的数值直接决定的,而是把像素值当作彩色查找表(CLUT)的表项入口地址,去查找一个显示图像时使用的R,G,B强度值,用查找出的R,G,B强度值产生的彩色称为伪彩色。彩色查找表CLUT是一个事先做好的表,表项入口地址也称为索引号。例如16种颜色的查找表,0号索引对应黑色,15号索引对应白色

在这里插入图片描述

通俗易懂地说,伪彩色就是在黑白灰度图像的基础上,通过颜色的变化突出图像的特定信息。例如,一张黑白皱巴巴的纸看上去可能很普通,但如果将图像变换成伪彩色,加入颜色的更丰富表现,则可能会呈现出更多的信息。同样,对于一张医学图像,通过伪彩色的增强方式,就能凸显出人体不同器官或疾病的具体位置和特征

在这里插入图片描述

(2)伪彩色处理图像增强概述

A:为什么需要彩色增强处理图像?

假设我们想在地图上显示不同地区的温度,我们可以把地图上的温度数据叠加为灰度图像,此时较暗的区域代表温度比较低、较亮的区域温度比较高。这样的表示其实有一定缺陷,第一个原因人类视觉系统对灰度强度的变化不灵敏,能够区分的灰度级一般只有二十几个,而对不同亮度和色调的彩色图像的分辨力能力却可以达到灰度分辨能力的数百倍以上;第二个原因是因为我们可以用不同的颜色代表不同的意义,比如用蓝色代表温度较低、红色代表温度较高

在这里插入图片描述

因此彩色增强处理图像的主要目的是为了改善图像的视觉效果和识别能力。对于很多实际应用中的图像,例如医学影像、卫星遥感图像等,单纯的灰度图像可能不足以满足人类视觉的需求,而加入彩色信息则可以让图像更容易被人眼识别和理解。具体来说,彩色增强处理图像具有以下好处:

  • 提高图像的对比度和亮度:彩色增强可以通过增加饱和度、调整色彩平衡等方式改善图像的对比度和亮度,使得图像更加清晰和易于观察
  • 突出图像的特征和细节:彩色增强可以通过调整色彩和饱和度等参数,突出图像中的特征和细节,例如目标区域、纹理等,从而更好地实现目标检测、图像分割等任务

彩色增强在图像增强中应用十分广泛,常见的彩色增强技术主要分为如下两类:

  • 假彩色增强:将一幅彩色图像映射为另一幅彩色图像,从而达到增强彩色对比,使图像更加醒目
  • 伪彩色增强:将图像灰度分级,然后对每个灰度值区间中的像素赋一种颜色,从而映射为彩色图像

B:伪彩色增强基本原理

伪彩色增强基本原理:伪彩色增强是一种将灰度图像转化为彩色图像的方法,它的基本原理是将灰度图像中的每个像素的灰度值映射到一个伪彩色表(也称为颜色映射表)上,从而生成一张带有伪彩色的图像。通常情况下,伪彩色表会根据不同的应用需求而定制,以达到最佳的图像增强效果

% 读入卫星图
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('伪彩色图');

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

C:伪彩色处理图像增强方法

①:密度分割法

密度分割法:这是伪彩色处理技术中最基本、最简单的一种方法。该方法的主要原理是将输入图像的灰度值分成若干个密度区间,每个密度区间分配一种颜色,生成一副带有伪彩色的图像。如下图,设一幅灰度图像 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));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
②:彩色变换法

彩色变换法:这种变换方法是对输入图像的灰度值实现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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
③:频域伪彩色处理

频域伪彩色处理:频率域伪彩色增强时,先把灰度图像

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/78306
推荐阅读
相关标签