opencv小波变换代码
时间: 2023-10-10 21:10:26 浏览: 148
以下是使用OpenCV进行小波变换的示例代码:
```python
import cv2
import numpy as np
# 读取图像
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
# 将图像拓展为2的倍数
rows, cols = img.shape
nrows = cv2.getOptimalDFTSize(rows)
ncols = cv2.getOptimalDFTSize(cols)
resized = cv2.copyMakeBorder(img, 0, nrows - rows, 0, ncols - cols, cv2.BORDER_CONSTANT, value=0)
# 对图像进行小波变换
coeffs = cv2.dwt2(resized, 'haar')
LL, (LH, HL, HH) = coeffs
# 显示结果
cv2.imshow('LL', np.uint8(LL))
cv2.imshow('LH', np.uint8(LH))
cv2.imshow('HL', np.uint8(HL))
cv2.imshow('HH', np.uint8(HH))
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`cv2.dwt2()`函数用于进行小波变换,第一个参数为输入图像,第二个参数为小波基函数,这里使用`haar`小波基函数。返回值为系数矩阵,其中LL表示低频系数,LH、HL、HH表示高频系数。
相关问题
opencv小波变换
可以使用OpenCV库进行小波变换。下面是一个使用OpenCV库进行小波变换的示例代码:
```python
import cv2
import pywt
import numpy as np
# 读取图像
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
# 进行小波变换
coeffs = pywt.dwt2(img, wavelet='haar')
# 获取小波变换的结果
cA, (cH, cV, cD) = coeffs
# 显示原始图像和小波变换结果
cv2.imshow("Original Image", img)
cv2.imshow("Approximation (cA)", cA)
cv2.imshow("Horizontal Detail (cH)", cH)
cv2.imshow("Vertical Detail (cV)", cV)
cv2.imshow("Diagonal Detail (cD)", cD)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码会读取一张灰度图像,然后使用haar小波进行二维小波变换。最后,分别显示原始图像、近似分量cA、水平细节分量cH、垂直细节分量cV和对角细节分量cD。
c++ opencv小波变换
小波变换是一种时频分析方法,可以将信号分解成不同频率的子带,从而更好地理解信号的特征。下面是使用C++和OpenCV进行一维连续小波变换的示例代码:
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/core/utility.hpp>
#include <iostream>
#include <vector>
#include <cmath>
using namespace cv;
using namespace std;
// 小波变换函数
void wavelet(Mat& src, Mat& dst, int level)
{
Mat temp = src.clone();
for (int i = 0; i < level; i++)
{
int rows = temp.rows;
int cols = temp.cols;
Mat LL, LH, HL, HH;
pyrDown(temp(Rect(0, 0, cols, rows)), LL);
pyrDown(temp(Rect(0, rows / 2, cols, rows / 2)), LH);
pyrDown(temp(Rect(cols / 2, 0, cols / 2, rows)), HL);
pyrDown(temp(Rect(cols / 2, rows / 2, cols / 2, rows / 2)), HH);
Mat LHHL;
pyrUp(LH, LHHL, LL.size());
Mat HHLH;
pyrUp(HL, HHLH, LL.size());
Mat HHLL;
pyrUp(HH, HHLL, LL.size());
Mat LL_new;
LL.copyTo(LL_new);
for (int i = 0; i < LL.rows; i++)
{
for (int j = 0; j < LL.cols; j++)
{
LL_new.at<float>(i, j) = (LL.at<float>(i, j) + LHHL.at<float>(i, j) + HHLH.at<float>(i, j) + HHLL.at<float>(i, j)) / 4;
}
}
temp = LL_new.clone();
}
dst = temp.clone();
}
int main()
{
// 生成测试信号
int N = 512;
Mat signal(N, 1, CV_32FC1);
for (int i = 0; i < N; i++)
{
signal.at<float>(i, 0) = sin(2 * CV_PI * i / 32) + sin(2 * CV_PI * i / 16);
}
// 进行小波变换
Mat dst;
wavelet(signal, dst, 3);
// 显示结果
Mat dst_show;
normalize(dst, dst_show, 0, 255, NORM_MINMAX);
dst_show.convertTo(dst_show, CV_8UC1);
imshow("Wavelet Transform", dst_show);
waitKey(0);
return 0;
}
```
上述代码中,我们首先生成了一个长度为512的测试信号,然后调用wavelet函数进行小波变换,最后将结果进行归一化并显示出来。在wavelet函数中,我们使用了OpenCV自带的pyrDown和pyrUp函数进行了一维小波变换。
阅读全文