一、简介

1 curvelet变换的提出


2 curvelet变换的研究进展及现状


3 第一代curvelet变换








4 实现过程


5 第二代 curvelet变换


6 连续的curvelet变换







7 离散的curvelet变换


二、部分源代码

function x = ifdct_wrapping(C, is_real, M, N)% ifdct_wrapping.m - Inverse Fast Discrete Curvelet Transform via wedge wrapping - Version 1.0
% This is in fact the adjoint, also the pseudo-inverse
%
% Inputs
%   C           Cell array containing curvelet coefficients (see
%               description in fdct_wrapping.m)
%   is_real     As used in fdct_wrapping.m
%   M, N        Size of the image to be recovered (not necessary if finest
%               = 2)
%
% Outputs
%   x           M-by-N matrix
%
% See also fdct_wrapping.m
%
% By Laurent Demanet, 2004% Initialization
nbscales = length(C);
nbangles_coarse = length(C{2});
nbangles = [1, nbangles_coarse .* 2.^(ceil((nbscales-(nbscales:-1:2))/2))];
if length(C{end}) == 1, finest = 2; else finest = 1; end;
if finest == 2, nbangles(nbscales) = 1; end;
if nargin < 2, is_real = 0; end;
if nargin < 4,if finest == 1, error('Syntax: IFCT_wrapping(C,M,N) where the matrix to be recovered is M-by-N'); end;[N1,N2] = size(C{end}{1});
elseN1 = M;N2 = N;
end;M1 = N1/3;
M2 = N2/3;if finest == 1;bigN1 = 2*floor(2*M1)+1;bigN2 = 2*floor(2*M2)+1;X = zeros(bigN1,bigN2);% Initialization: preparing the lowpass filter at finest scalewindow_length_1 = floor(2*M1) - floor(M1) - 1 - (mod(N1,3)==0);window_length_2 = floor(2*M2) - floor(M2) - 1 - (mod(N2,3)==0);coord_1 = 0:(1/window_length_1):1;coord_2 = 0:(1/window_length_2):1;[wl_1,wr_1] = fdct_wrapping_window(coord_1);[wl_2,wr_2] = fdct_wrapping_window(coord_2);lowpass_1 = [wl_1, ones(1,2*floor(M1)+1), wr_1];if mod(N1,3)==0, lowpass_1 = [0, lowpass_1, 0]; end;lowpass_2 = [wl_2, ones(1,2*floor(M2)+1), wr_2];if mod(N2,3)==0, lowpass_2 = [0, lowpass_2, 0]; end;lowpass = lowpass_1'*lowpass_2;scales = nbscales:-1:2;elseM1 = M1/2;M2 = M2/2;bigN1 = 2*floor(2*M1)+1;bigN2 = 2*floor(2*M2)+1;X = zeros(bigN1,bigN2);window_length_1 = floor(2*M1) - floor(M1) - 1;window_length_2 = floor(2*M2) - floor(M2) - 1;coord_1 = 0:(1/window_length_1):1;coord_2 = 0:(1/window_length_2):1;[wl_1,wr_1] = fdct_wrapping_window(coord_1);[wl_2,wr_2] = fdct_wrapping_window(coord_2);lowpass_1 = [wl_1, ones(1,2*floor(M1)+1), wr_1];lowpass_2 = [wl_2, ones(1,2*floor(M2)+1), wr_2];lowpass = lowpass_1'*lowpass_2;hipass_finest = sqrt(1 - lowpass.^2);scales = (nbscales-1):-1:2;end;% Loop: pyramidal reconstructionXj_topleft_1 = 1;
Xj_topleft_2 = 1;
for j = scales,M1 = M1/2;M2 = M2/2;window_length_1 = floor(2*M1) - floor(M1) - 1;window_length_2 = floor(2*M2) - floor(M2) - 1;coord_1 = 0:(1/window_length_1):1;coord_2 = 0:(1/window_length_2):1;[wl_1,wr_1] = fdct_wrapping_window(coord_1);[wl_2,wr_2] = fdct_wrapping_window(coord_2);lowpass_1 = [wl_1, ones(1,2*floor(M1)+1), wr_1];lowpass_2 = [wl_2, ones(1,2*floor(M2)+1), wr_2];lowpass_next = lowpass_1'*lowpass_2;hipass = sqrt(1 - lowpass_next.^2);Xj = zeros(2*floor(4*M1)+1,2*floor(4*M2)+1);% Loop: anglesl = 0;nbquadrants = 2 + 2*(~is_real);nbangles_perquad = nbangles(j)/4;for quadrant = 1:nbquadrantsM_horiz = M2 * (mod(quadrant,2)==1) + M1 * (mod(quadrant,2)==0);M_vert = M1 * (mod(quadrant,2)==1) + M2 * (mod(quadrant,2)==0);if mod(nbangles_perquad,2),wedge_ticks_left = round((0:(1/(2*nbangles_perquad)):.5)*2*floor(4*M_horiz) + 1);wedge_ticks_right = 2*floor(4*M_horiz) + 2 - wedge_ticks_left;wedge_ticks = [wedge_ticks_left, wedge_ticks_right(end:-1:1)];elsewedge_ticks_left = round((0:(1/(2*nbangles_perquad)):.5)*2*floor(4*M_horiz) + 1);wedge_ticks_right = 2*floor(4*M_horiz) + 2 - wedge_ticks_left;wedge_ticks = [wedge_ticks_left, wedge_ticks_right((end-1):-1:1)];end;wedge_endpoints = wedge_ticks(2:2:(end-1));         % integerswedge_midpoints = (wedge_endpoints(1:(end-1)) + wedge_endpoints(2:end))/2;% Left corner wedgel = l+1;first_wedge_endpoint_vert = round(2*floor(4*M_vert)/(2*nbangles_perquad) + 1);length_corner_wedge = floor(4*M_vert) - floor(M_vert) + ceil(first_wedge_endpoint_vert/4);Y_corner = 1:length_corner_wedge;[XX,YY] = meshgrid(1:(2*floor(4*M_horiz)+1),Y_corner);width_wedge = wedge_endpoints(2) + wedge_endpoints(1) - 1;slope_wedge = (floor(4*M_horiz) + 1 - wedge_endpoints(1))/floor(4*M_vert);left_line = round(2 - wedge_endpoints(1) + slope_wedge*(Y_corner - 1));[wrapped_XX, wrapped_YY] = deal(zeros(length_corner_wedge,width_wedge));first_row = floor(4*M_vert)+2-ceil((length_corner_wedge+1)/2)+...mod(length_corner_wedge+1,2)*(quadrant-2 == mod(quadrant-2,2));first_col = floor(4*M_horiz)+2-ceil((width_wedge+1)/2)+...mod(width_wedge+1,2)*(quadrant-3 == mod(quadrant-3,2));for row = Y_cornercols = left_line(row) + mod((0:(width_wedge-1))-(left_line(row)-first_col),width_wedge);new_row = 1 + mod(row - first_row, length_corner_wedge);admissible_cols = round(1/2*(cols+1+abs(cols-1)));wrapped_XX(new_row,:) = XX(row,admissible_cols);wrapped_YY(new_row,:) = YY(row,admissible_cols);end;slope_wedge_right = (floor(4*M_horiz)+1 - wedge_midpoints(1))/floor(4*M_vert);mid_line_right = wedge_midpoints(1) + slope_wedge_right*(wrapped_YY - 1);% not integers% in generalcoord_right = 1/2 + floor(4*M_vert)/(wedge_endpoints(2) - wedge_endpoints(1)) * ...(wrapped_XX - mid_line_right)./(floor(4*M_vert)+1 - wrapped_YY);C2 = 1/(1/(2*(floor(4*M_horiz))/(wedge_endpoints(1) - 1) - 1) + 1/(2*(floor(4*M_vert))/(first_wedge_endpoint_vert - 1) - 1));C1 = C2 / (2*(floor(4*M_vert))/(first_wedge_endpoint_vert - 1) - 1);wrapped_XX((wrapped_XX - 1)/floor(4*M_horiz) + (wrapped_YY-1)/floor(4*M_vert) == 2) = ...wrapped_XX((wrapped_XX - 1)/floor(4*M_horiz) + (wrapped_YY-1)/floor(4*M_vert) == 2) + 1;coord_corner = C1 + C2 * ((wrapped_XX - 1)/(floor(4*M_horiz)) - (wrapped_YY - 1)/(floor(4*M_vert))) ./ ...(2-((wrapped_XX - 1)/(floor(4*M_horiz)) + (wrapped_YY - 1)/(floor(4*M_vert))));wl_left = fdct_wrapping_window(coord_corner);[wl_right,wr_right] = fdct_wrapping_window(coord_right);switch is_realcase 0wrapped_data = fftshift(fft2(ifftshift(C{j}{l})))/sqrt(prod(size(C{j}{l})));wrapped_data = rot90(wrapped_data,(quadrant-1));case 1x = C{j}{l} + sqrt(-1)*C{j}{l+nbangles(j)/2};wrapped_data = fftshift(fft2(ifftshift(x)))/sqrt(prod(size(x)))/sqrt(2);wrapped_data = rot90(wrapped_data,(quadrant-1));end;wrapped_data = wrapped_data .* (wl_left .* wr_right);% Unwrapping datafor row = Y_cornercols = left_line(row) + mod((0:(width_wedge-1))-(left_line(row)-first_col),width_wedge);admissible_cols = round(1/2*(cols+1+abs(cols-1)));new_row = 1 + mod(row - first_row, length_corner_wedge);Xj(row,admissible_cols) = Xj(row,admissible_cols) + wrapped_data(new_row,:);% We use the following property: in an assignment% A(B) = C where B and C are vectors, if% some value x repeats in B, then the% last occurrence of x is the one% corresponding to the eventual assignment.end;% Regular wedgeslength_wedge = floor(4*M_vert) - floor(M_vert);Y = 1:length_wedge;first_row = floor(4*M_vert)+2-ceil((length_wedge+1)/2)+...mod(length_wedge+1,2)*(quadrant-2 == mod(quadrant-2,2));for subl = 2:(nbangles_perquad-1);l = l+1;width_wedge = wedge_endpoints(subl+1) - wedge_endpoints(subl-1) + 1;slope_wedge = ((floor(4*M_horiz)+1) - wedge_endpoints(subl))/floor(4*M_vert);left_line = round(wedge_endpoints(subl-1) + slope_wedge*(Y - 1));[wrapped_XX, wrapped_YY] = deal(zeros(length_wedge,width_wedge));first_col = floor(4*M_horiz)+2-ceil((width_wedge+1)/2)+...mod(width_wedge+1,2)*(quadrant-3 == mod(quadrant-3,2));for row = Ycols = left_line(row) + mod((0:(width_wedge-1))-(left_line(row)-first_col),width_wedge);new_row = 1 + mod(row - first_row, length_wedge);wrapped_XX(new_row,:) = XX(row,cols);wrapped_YY(new_row,:) = YY(row,cols);end;slope_wedge_left = ((floor(4*M_horiz)+1) - wedge_midpoints(subl-1))/floor(4*M_vert);mid_line_left = wedge_midpoints(subl-1) + slope_wedge_left*(wrapped_YY - 1);coord_left = 1/2 + floor(4*M_vert)/(wedge_endpoints(subl) - wedge_endpoints(subl-1)) * ...(wrapped_XX - mid_line_left)./(floor(4*M_vert)+1 - wrapped_YY);slope_wedge_right = ((floor(4*M_horiz)+1) - wedge_midpoints(subl))/floor(4*M_vert);mid_line_right = wedge_midpoints(subl) + slope_wedge_right*(wrapped_YY - 1);coord_right = 1/2 + floor(4*M_vert)/(wedge_endpoints(subl+1) - wedge_endpoints(subl)) * ...(wrapped_XX - mid_line_right)./(floor(4*M_vert)+1 - wrapped_YY);wl_left = fdct_wrapping_window(coord_left);[wl_right,wr_right] = fdct_wrapping_window(coord_right);switch is_realcase 0wrapped_data = fftshift(fft2(ifftshift(C{j}{l})))/sqrt(prod(size(C{j}{l})));wrapped_data = rot90(wrapped_data,(quadrant-1));case 1x = C{j}{l} + sqrt(-1)*C{j}{l+nbangles(j)/2};wrapped_data = fftshift(fft2(ifftshift(x)))/sqrt(prod(size(x)))/sqrt(2);wrapped_data = rot90(wrapped_data,(quadrant-1));end;wrapped_data = wrapped_data .* (wl_left .* wr_right);% Unwrapping datafor row = Ycols = left_line(row) + mod((0:(width_wedge-1))-(left_line(row)-first_col),width_wedge);new_row = 1 + mod(row - first_row, length_wedge);Xj(row,cols) = Xj(row,cols) + wrapped_data(new_row,:);end;end;    % for subl% Right corner wedgel = l+1;width_wedge = 4*floor(4*M_horiz) + 3 - wedge_endpoints(end) - wedge_endpoints(end-1);slope_wedge = ((floor(4*M_horiz)+1) - wedge_endpoints(end))/floor(4*M_vert);left_line = round(wedge_endpoints(end-1) + slope_wedge*(Y_corner - 1));[wrapped_XX, wrapped_YY] = deal(zeros(length_corner_wedge,width_wedge));first_row = floor(4*M_vert)+2-ceil((length_corner_wedge+1)/2)+...mod(length_corner_wedge+1,2)*(quadrant-2 == mod(quadrant-2,2));first_col = floor(4*M_horiz)+2-ceil((width_wedge+1)/2)+...mod(width_wedge+1,2)*(quadrant-3 == mod(quadrant-3,2));

三、运行结果



四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

【图像融合】基于matlab curvelet变换图像融合【含Matlab源码 776期】相关推荐

  1. 【Matlab图像融合】小波变换遥感图像融合【含GUI源码 744期】

    一.代码运行视频(哔哩哔哩) [Matlab图像融合]小波变换遥感图像融合[含GUI源码 744期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  2. 【Matlab图像加密】正交拉丁方置乱算法图像加解密【含GUI源码 182期】

    一.代码运行视频(哔哩哔哩) [Matlab图像加密]正交拉丁方置乱算法图像加解密[含GUI源码 182期] 二.matlab版本及参考文献 一.代码运行视频(哔哩哔哩) [Matlab图像处理]自动 ...

  3. 【Matlab人脸识别】KL变换人脸识别【含GUI源码 859期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]KL变换人脸识别[含GUI源码 859期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MAT ...

  4. 【Matlab答题卡识别】hough变换答题卡判定与成绩统计【含GUI源码 752期】

    一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计[含GUI源码 752期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [ ...

  5. 【Matlab答题卡识别】hough变换答题卡判定与成绩统计(带面板)【含GUI源码 1017期】

    一.代码运行视频(哔哩哔哩) [Matlab答题卡识别]hough变换答题卡判定与成绩统计(带面板)[含GUI源码 1017期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 ...

  6. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  7. 【Matlab人脸识别】形态学教室人数统计(带面板)【含GUI源码 1703期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]形态学教室人数统计(带面板)[含GUI源码 1703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟 ...

  8. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

  9. 【Matlab车牌识别】停车计费系统【含GUI源码 735期】

    一.代码运行视频(哔哩哔哩) [Matlab车牌识别]停车计费系统[含GUI源码 735期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLA ...

  10. 【Matlab生物电信号】生物电信号仿真【含GUI源码 684期】

    一.代码运行视频(哔哩哔哩) [Matlab生物电信号]生物电信号仿真[含GUI源码 684期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]董兵,超于毅,李 ...

最新文章

  1. java word转html 烟火,Java多线程制作烟花效果.doc
  2. spring suite tool 添加namespace时只有bean一个
  3. 服务器环境~某个页面无法访问的处理
  4. es统计有多少个分组_ES 24 - 如何通过Elasticsearch进行聚合检索 (分组统计)
  5. java演练 数组的逆序文字玩法 你是猪才怪
  6. macos复制粘贴快捷键 快速_探究Mac OS十大键盘快捷键
  7. html单页倒计时,单页面vue实例带倒计时功能
  8. Visual Studio 2015 专业版安装方法
  9. 车牌识别easypr的详细介绍
  10. 苹果笔记本装win7_小白“复活记”,十多年前的MacBook,曲折安装Win7
  11. 如何实现Iframe透明
  12. 怎样在Excel中添加水印?学会这个方法可以轻松搞定
  13. uni-app h5页面图片压缩
  14. Android穿山甲SDK激励视频
  15. 2019级第二次月赛暨软件计科联合新生赛题解
  16. 雷啊:淘宝上卖F22战斗机
  17. java培训班 跟不上_如果去了Java培训班跟不上进度怎么办?
  18. html中怎么让text不换行,css如何让文本不换行?
  19. 使用ansible批量修改主机名后/etc/hosts文件不能被正确修改的修复方法
  20. Codeforces Round #806 (Div. 4)题解

热门文章

  1. redis 慢日志查询
  2. ---perl 模块安装方法
  3. 图解android开发在界面上显示图片
  4. java笔记--关于int和byte[]的转换
  5. javascript中的var浅析
  6. 【转】几个颇有创意的网站推广方法
  7. 2021-10-13
  8. 190804每日一句
  9. 190122每日一句
  10. 扇贝有道180922每日一句