04 数字图像技术——图像特征提取之实验结果与分析
03 数字图像技术——频域滤波实验结果与分析
02 数字图像技术——颜色空间转换与颜色空间分割实验结果与分析
01 数字图像基本操作——图像采样、量化、算术运算、点运算实验结果及分析
1.理解颜色直方图、颜色矩的基本原理;
2.理解统计纹理分析算法的基本原理;
3.理解局部二值模式的基本原理。
1.颜色直方图、颜色矩。
2.基于灰度变换的伪彩色算法。
3.局部二值模式。
1.计算机;
2.python语言开发环境;
3.移动式存储器(软盘、U盘等)。
4.记录用的笔、纸。
1.灰度共生矩阵
灰度共生矩阵是以条件概率提取纹理的特征,它反映的是灰度图像中关于方向、间隔和变化幅度等方面的灰度信息,因此可以用于分析图像的局部特征以及纹理的分布规律。
灰度共生矩阵有两种定义形式,第一种定义为:
设灰度图像矩阵为G,位置相距为 、灰度值为i和j的两个像素点对同时出现的联合概率分布称为灰度共生矩阵。若将灰度等级分为n档,那么联合概率分布可以用n×n阶的灰度共生矩阵表示。
为3×3的灰度矩阵,将原有的灰度级分为2档,1和2为第1档,3和4为第2档; 当(△x, △y)=(1,0)时,灰度组合数位:(1,2), (2,1), (3,4), (4,4), (2,3), (3,1)。其属于的灰度档为:(1,1), (1,1), (2,2), (2,2), (1,2), (2,1)。
因此(1,1)出现了2次,(2,2)出现了2次,(1,2)和(2,1)各出现了1次,此时构成的共生矩阵为:
第二种定义:
设某个点对的间隔为d,两点之间连线与轴的方向角为θ,两点灰度级分别为i和j,则其共生矩阵可以表示为[P(i,j,d,θ)],点(i,j)处的值代表的是满足对应条件的数目值。其中,d不宜取得过大,一般来说取窗口大小为22×22~ 25×25,以Ox轴为起始,通常θ=0°、45°、90°、135°,逆时钟方向计算。
共生矩阵反映的是整幅图像灰度分布的综合信息,由此出发,设给定值d和θ值,将共生矩阵内各个元素进行归一化处理并记为p(i,j),可以进一步提取出描述纹理特征的一系列特征值如下:
(1)角二阶矩或能量
(5)逆差矩
2. 颜色空间的基本概念
图像的颜色空间包括某个颜色域的所有颜色。常用的颜色模型有NTSC、HSV、YCbCr等模型。各种颜色空间在图像处理中各有优势,且可以互相转换。
在NTSC格式中,图像由三个分量表示。第一个分量亮度Y表示灰度信息,后两个分量(I,Q)表示色度信息。RGB空间向YIQ空间转换方法:
HSV模型常用于选择颜色,它是面向用户的一种复合主观感觉的色彩模型,比RGB模型更接近人们对颜色的感知。具体转换公式参见理论教材。
在YCbCr模型中,Y为亮度,Cb和Cr共同描述图像的色调,其中Cb、Cr分别为蓝色分量和红色分量相对于参考值的坐标。RGB空间向YCbCr空间转换方法:
3.伪彩色处理
(1)空域伪彩色处理
伪彩色处理是把灰度图像的各个不同灰度按照线性或非线性的映射函数变换成不同的彩色,也可以将原来不是图像的数据表示成灰度图像,再转换成彩色图像达到增强的目的。
最简单的实现从灰度到彩色的变换方法可以把灰度图像的灰度级从0(黑)到Mi(白)分成N 个区间,i=1,2,L, N 。给每个区间Ii指定一种色彩Ci。该方法直观简单,缺点是变换出的彩色有限。
从灰度到彩色的一种更具代表性的变换方式是根据色度学的原理,将原图像 f(x,y)的灰度分段经过红、绿、蓝三种不同的变换,变成三基色分量R(x,y) 、G(x,y)、B(x,y),然后用它们去控制彩色显示器的红、绿、蓝电子枪,以产生相应的彩色信号,彩色的含量由变换函数的形状决定。
(2)频域伪彩色处理
这种方法是先把灰度图像经过傅立叶变换到频域,在频域内用三个不同传递特性的滤波器分离成三个独立分量,再对它们进行傅立叶的反变换,得到三副代表不同频率成分的单色图像,对这三副图像再做进一步的处理,然后将三基色的分量分别加到彩色显示器的红、绿、蓝显示通道,从而实现频域分段的伪彩色增强。
1. 彩色图像的分析
(1)调入并显示彩色图像flower1.tif ;
(2)拆分这幅图像,并分别显示其R,G,B分量;
(3)根据各个分量图像的情况讨论该彩色图像的亮度、色调等性质。
2 彩色图像的直方图均衡
(1)接内容1;
(2)显示这幅图像的R,G,B分量的直方图,分别进行直方图均衡处理,并显示均衡后的直方图和直方图均衡处理后的各分量;
(3)将处理完毕的各个分量合成彩色图像并显示其结果;
(4)观察处理前后图像的彩色、亮度、色调等性质的变化。
3 伪彩色处理
(1)意义:将亮度低的映射为蓝色(冷色),亮度高的映射为红色(暖色)。
(2)方法:分别用三个矩阵保存,三个通道的灰度值。每个通道的灰度值,有不同的映射函数。
(3)输入灰度级 对应的输出彩色
% 0~63 1/4 蓝色
% 64~127 2/4 紫色
% 128~191 3/4 黄色
% 192~255 4/4 红色
图 1 颜色直方图流程图 图 2 实现颜色矩流程图
一般颜色直方图代码如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文
def imageHist(img, type):
# color = (255, 255, 255)
if type == 31:
color = (255, 0, 0)
windowName = 'B Hist'
elif type == 32:
color = (0, 255, 0)
windowName = 'G Hist'
elif type == 33:
color = (0, 0, 255)
windowName = 'R Hist'
Hist = cv2.calcHist([img], [0], None, [256], [0.0, 255.0]) # 计算直方图
minV, maxV, minL, MaxL = cv2.minMaxLoc(Hist) # 获取最大值和最小值,并获取其对应的下标
HistImage = np.zeros([256, 256, 3], np.uint8) # 新建图像模板,用于直方图的绘制
for h in range(256):
intenormal = int(Hist[h] * 256 / maxV) # 避免超出范围
cv2.line(HistImage, (h, 256), (h, 256 - intenormal), color) # 绘制直方图
cv2.imshow(windowName, HistImage)
return HistImage
img = cv2.imread('D:\shuzi_image\cat.jpg')
channels = cv2.split(img)
for i in range(0, 3):
imageHist(channels[i], i + 31)
cv2.waitKey(0)
plt.figure()
plt.imshow(img)
plt.title('原始图像')
plt.show()
from matplotlib import pyplot as plt
from skimage import data, exposure,io
import numpy as np
from scipy import stats
# 中文显示工具函数
def set_ch():
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
set_ch()
image = io.imread('D:\shuzi_image\kk.jpg')
#image = data.coffee()
# 求RGB图像的颜色矩特征,共9维特征
# 定义3*3数组,分别对RGB图像的三个通道求均值、方差、偏移量
features = np.zeros(shape=(3, 3))
for k in range(image.shape[2]):
mu = np.mean(image[:, :, k]) # 求均值
delta = np.std(image[:, :, k]) # 求方差
skew = np.mean(stats.skew(image[:, :, k])) # 求偏移量
features[0, k] = mu
features[1, k] = delta
features[2, k] = skew
print(features)
%题目:基于灰度变换的伪彩色方法
%意义:将亮度低的映射为蓝色(冷色),亮度高的映射为红色(暖色)。
%方法:分别用三个矩阵保存,三个通道的灰度值。每个通道的灰度值,有不同的映射函数。
% 输入灰度级 输出彩色
% 0~63 1/4 蓝色
% 64~127 2/4 紫色
% 128~191 3/4 黄色
% 192~255 4/4 红色
clc;
clear;
grayImage=rgb2gray(imread('kkk.jpg'));
figure,imshow(grayImage);
[row,col]=size(grayImage);
range=255;%每个通道的最大灰度值
R = zeros(row,col);
G = zeros(row,col);
B = zeros(row,col);
for i=1:row
for j=1:col
if grayImage(i,j)<=range/4% [0,64]偏蓝
R(i,j)=0;
G(i,j)=4*grayImage(i,j);
B(i,j)=range;
else if grayImage(i,j)<=range/2% (64,128] 偏紫
R(i,j)=0;
G(i,j)=range;
B(i,j)=-4*grayImage(i,j)+2*range;
else if grayImage(i,j)<=3*range/4% (128, 192]
R(i,j)=4*grayImage(i,j)-2*range;
G(i,j)=range;
B(i,j)=0;
else
R(i,j)=range;
G(i,j)=4*(range-grayImage(i,j));
B(i,j)=0;
end
end
end
end
end
out = zeros(row,col);
for i=1:row
for j=1:col
out(i,j,1)=R(i,j);
out(i,j,2)=G(i,j);
out(i,j,3)=B(i,j);
end
end
out=out/256;
figure,imshow(out);
import skimage.feature
import skimage.segmentation
import matplotlib.pyplot as plt
from skimage import data,io
from skimage.data import coffee
#img = coffee()
img = io.imread("D:\shuzi_image\cat.jpg")
for colour_channel in (0, 1, 2):
img[:, :, colour_channel] = skimage.feature.local_binary_pattern(
img[:, :, colour_channel], 8,1.0,method='var')
plt.imshow(img)
plt.show()