小波变换
小波分析
小波变换分成两个大类:离散小波变换(DWT) 和连续小波转换(CWT)。两者的主要区别在于,连续变换在所有可能的缩放和平移上操作,而离散变换采用所有缩放和平移值的特定子集。所有小波变换可以视为时域频域表示的形式,所以和调和分析相关。
应用
1.影像分割
影像分割可以定义为,将影像分成若干个区域,而这些像素组成区域必须为各个类似的像素所连结而成.
临界值法: 主要是靠设定临界值,来去区分物体与背景.
区域法: 将影像分为若干个子区域,这些子区域有相连性
边界法: 借由求影像梯度大小,来找出正确影像边界的方法
边缘法: 利用一阶导数的大小来侦测出边缘所在的位置,之后再使用一阶导数的方向将小的边缘连结成边界的方法.
借由小波转换的方法,将原始的影像,经过特定的小波转换的技巧后, EX: symlets wavelet, 滤除掉噪声,并且 对X轴方向做一次小波转换,对Y轴方向做一次小波转换,之后采用影像分割的方法,提高影像分割的精确度.
2.影像压缩
原始的图形资料 -> 色彩模式的转换 -> DCT转换 -> 量化器 -> 编码器 -> 压缩完成
算法细节参考小波压缩。
3.边缘侦测
4.音乐信号分析
5.遥测影像分析
6.生物医学信号分析:心电图 (Electrocardiography) 与脑波图 (Electroencephalography)
小波转换的优点
可以同时观察频率和时间轴,在频率高时有较好的时间清晰度,在频率低时有较好的频率清晰度。
有快速小波转换可以加速运算。
可以分离出信号的精细或粗糙成分。
在小波理论中,可以用较少的小波系数去逼近一个函数。
对信号去噪或压缩信号时,不会对信号造成明显的破坏。
适用于分析突变信号,以及奇异信号
可以分析信号不同scale大小样貌
代码实现
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
53import numpy as np import pywt import cv2 import matplotlib.pyplot as plt from skimage import data,filters from numpy import * #1 读入图片数据 img = cv2.imread("huidu4.png") img = cv2.resize(img, (448, 448)) # 将多通道图像变为单通道图像 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).astype(np.float32) noiseSigma=0.04 img =img+random.normal(0, noiseSigma, size=img.shape) #生成正态分布 plt.figure('小波变换分解一层') ##coeffs = pywt.dwt2(img, 'haar') # 2分解一层 coeffs = pywt.wavedec2( img, 'haar', level=1) cA, (cH, cV, cD) = coeffs # 将各个子图进行拼接,最后得到一张图(影像压缩) AH = np.concatenate([cA, cH], axis=1) # np.concatenate 数组拼接函数 axis表示对应行 VD = np.concatenate([cV, cD], axis=1) img1 = np.concatenate([AH, VD], axis=0) ##可以进行图像阈值分割/(影像分割) thresh = filters.threshold_otsu(img) #返回一个阈值 dst =(img<= thresh)*1.0 #根据阈值进行分割 #软阈值 重构 计算系数 #pywt.thresholding.软,尤其是它的lambda表达式:lambda x: pywt.thresholding.soft(x, threshold) threshold = noiseSigma*sqrt(2*log2(img.size)) NewWaveletCoeffs = map (lambda x: pywt.thresholding.soft(x,threshold), coeffs) NewImage = pywt.waverec2( coeffs, 'haar') titles = ['Source','compression','segmentation' ,"reconstruction"] images = [img ,img1,dst,NewImage] for i in range(4): plt.subplot(1,4,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() ##1 图片 ##2 分解 ##3 阈值(同时进行处理) ##4 重构 ##5 图片
效果图
图二是将影像经过处理的结果,可以看出在高频部分,左下角为水平方向的边缘;右上方为垂直方向的边缘;右下方为图形的角落。而左上角为低频,可继续做小波转换,分出更粗略、接近原影像的缩略图,来达到压缩效果。
图三是图像阈值分割技术。把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像。
图四是重构之后的图像。
彩色图像分量处理
split函数:返回值顺序为:B、G、R
代码
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
53##提取lena图像的R、G、B成分 #encoding:utf-8 # #彩图R、G、B的提取 # import numpy as np import cv2 import matplotlib.pyplot as plt image = cv2.imread("caise2.jpg") #R、G、B分量的提取 (B,G,R) = cv2.split(image)# 通道分解提取R、G、B分量 BH = cv2.equalizeHist(B) # 对b分量进行均衡化 GH = cv2.blur(G, (5,5)) # 对b分量进行均值滤波化 RH = cv2.medianBlur(R,5)# 对b分量进行中值滤波化 #显示原图和每个分量操作后的图像 (这里因为Plt会有些变色) titles = ['Original', 'Red','Green',"Blue"] images = [image,BH,GH,RH] for i in range(4): plt.subplot(1,4,i+1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show() ###encoding:utf-8 ## ### ###彩图R、G、B的提取与合并 ### ##import numpy as np ##import cv2 ## ##image = cv2.imread("H:\img\lena.jpg") ##cv2.imshow("Original",image) ##cv2.waitKey(0) ## ###R、G、B分量的提取 ##(B,G,R) = cv2.split(image)#提取R、G、B分量 ###R、G、B的合并 ##merged = cv2.merge([B,G,R])#合并R、G、B分量 ##cv2.imshow("Merged",merged) ##cv2.waitKey(0)
效果图
上图是对每个分量进行平滑或者锐化滤波器处理之后的结果,由于用到了plt进行显示,所以会出现变色问题,上一个文章有对变色问题的处理。
参考:
https://zh.wikipedia.org/wiki/%E5%B0%8F%E6%B3%A2%E5%88%86%E6%9E%90
最后
以上就是深情小蝴蝶最近收集整理的关于小波变换(分解/重构)和彩色图像分量处理小波变换彩色图像分量处理代码效果图的全部内容,更多相关小波变换(分解/重构)和彩色图像分量处理小波变换彩色图像分量处理代码效果图内容请搜索靠谱客的其他文章。
发表评论 取消回复