pdfbdenoiseimage.m
上传用户:l56789
上传日期:2022-02-25
资源大小:2422k
文件大小:4k
- % pdfbdenoiseimagethmt.m
- % written by: Duncan Po
- % Date: January 14, 2004
- % Clean the noisy image using the model and state probabilities of the
- % noisy image. The image is assumed to be square.
- % Usage: cleanimage = pdfbdenoiseimage( model, stateprob, nvar, nc, imname, imformat)
- % Inputs: model - model of the noisy image
- % stateprob - state probabilities of the noisy image
- % nvar - noise variance, normalized to the image range
- % (ie. should be between 0 and 1)
- % nc - noise variance in contourlet domain. Input '' if
- % unknown
- % imname - name of the image file
- % imformat - format of the image file (e.g. 'gif')
- % Output: cleanimage - the denoised image
- function cleanimage = pdfbdenoiseimage( model, stateprob, nvar, nc, imname, imformat)
- pyrfilter = '9-7';
- dirfilter = 'pkva';
- nlevel = model{1}.nlevels;
- for lev = 1:nlevel
- levndir(lev) = log2(length(model{1}.stdv{lev})*length(model));
- end;
- if nargin == 6
- coef = contourlet(pyrfilter, dirfilter, levndir, imname, imformat);
- elseif nargin == 5
- coef = contourlet(pyrfilter, dirfilter, levndir, imname);
- end;
- % Verify image is square and obtain image dimensions
- [nrow, ncol] = size(coef{2}{1});
- imagestats = imfinfo(imname, imformat);
- imdim = imagestats.Width;
- if imdim ~= imagestats.Height
- error('Image must be square.');
- end
- for state = 1:size(stateprob{1}{1},2)
- for lev = 1:nlevel+1
- newstateprob{state}{lev} = [];
- covariance{state}{lev} = [];
- end;
- end;
- % process stateprob, and covariance so that it has the same structure as coef
- for state = 1:size(stateprob{1}{1},2)
- for dir = 1:2.^levndir(1)
- for scale = 1:length(stateprob{dir})
- tempsp{scale} = stateprob{dir}{scale}(:,state);
- end;
- tempstateprob = tree2contourlet(tempsp, dir, levndir, nrow, ncol);
-
- for lev = 1:nlevel
- newstateprob{state}{lev+1} = [newstateprob{state}{lev+1} tempstateprob{lev}];
- for subdir = 1:length(model{dir}.stdv{lev})
- covariance{state}{lev+1} = [covariance{state}{lev+1} ...
- {ones(size(coef{lev+1}{(dir-1)*(2.^(levndir(lev)-levndir(1)))+subdir},1),...
- size(coef{lev+1}{(dir-1)*(2.^(levndir(lev)-levndir(1)))+subdir},2))*...
- model{dir}.stdv{lev}{subdir}(state)*model{dir}.stdv{lev}{subdir}(state)}];
- end;
- end;
- end;
- end;
- % calculates the noise variance in contourlet domain
- if isempty(nc)
- nc = contournc(nvar, pyrfilter, dirfilter, levndir, imdim);
- end;
- % computes the attenuator for each coefficient and state
- for state = 1:length(covariance)
- for lev = 2:nlevel+1
- for dir = 1:length(covariance{state}{lev})
- [covrow, covcol] = size(covariance{state}{lev}{dir});
- covariance{state}{lev}{dir}=max(covariance{state}{lev}{dir}...
- -nc{lev}{dir}, zeros(covrow, covcol))./covariance{state}{lev}{dir};
- end;
- end;
- end;
- % multiplies each contourlet coefficient with its corresponding state probabilities
- for state = 1:length(newstateprob)
- for lev = 2:nlevel+1
- for dir = 1:length(newstateprob{state}{lev})
- newcoef{state}{lev}{dir} = newstateprob{state}{lev}{dir}...
- .*coef{lev}{dir};
- end;
- end;
- end;
- % we don't denoise the scaling function since its SNR is high
- cleancoef{1} = coef{1};
- % initialize the clean coefficients
- for lev = 2:nlevel+1
- for dir = 1:length(newstateprob{state}{lev})
- cleancoef{lev}{dir} = zeros(size(coef{lev}{dir},1), size(coef{lev}{dir},2));
- end;
- end;
-
- % denoise
- for state = 1:length(newstateprob)
- for lev = 2:nlevel+1
- for dir = 1:length(newstateprob{state}{lev})
- cleancoef{lev}{dir}=cleancoef{lev}{dir}+covariance{state}{lev}{dir}...
- .*newcoef{state}{lev}{dir};
- end;
- end;
- end;
- cleanimage = pdfbrec(cleancoef, pyrfilter, dirfilter);
- figure;
- imshow(uint8(cleanimage));