三种经典图像滤波方法介绍——双边滤波(Bilateral filter)、导向滤波(Guided Fliter)、滚动导向滤波(RollingGuidedFilter)

2023-11-10

一、前言

滤波作为最基础的图像处理手段之一,在图像处理领域占有重要位置,常被用于图像去噪、尺度分解等。从均值滤波到滚动导向滤波,滤波不断朝着精准分离图像中不同尺度信息的方向前进。
我在文中整理了双边滤波、导向滤波、滚动制导滤波三种在图像处理中常见且在论文中经常被使用的滤波方法。这三种滤波较之最基础的均值、高斯滤波有着更加优异的性能和可研究空间。直到现在,一些论文中提出的先进滤波算法仍是以它们为基础进行改进得到的。例如在图像多尺度分解领域中,以这三种滤波和它们的变体组成的图像分解模型几乎占据了基于滤波的图像多尺度分解的半壁江山。至今仍有学者在该方向上发表论文。
希望通过本文的讲述让大家一次性学会这三种最重要的滤波(当然,大家要先懂得滤波的概念并学习过如高斯滤波等一些最基础的滤波),话不多说,上正文!

二、双边滤波(Bilateral filter)

2.1 双边滤波的理论介绍及公式推导

双边滤波由C. Tomasi在1998年提出,是一种经典的非线性空间滤波方法。在滤波器稀疏的制定上,双边滤波同时考虑到了输出像素与邻域内其它像素的欧氏距离和取值的差异,即:同时考虑到了空间域和值域间的差别。如维纳滤波和高斯滤波等只考虑了空间域的滤波方法,在滤波后对边缘信息的保护效果不理想;如α-截尾均值滤波器等只考虑值域的滤波方法,在滤波后图像整体模糊,不能有效的保护细节信息。双边滤波器综合考量了空间域和值域对于滤波产生的影响,因而能达到保持边缘,降噪平滑的效果,是一种良好的边缘保持滤波器。
双边滤波通过基于高斯分布的加权平均方法实现。以图像中具体的像素值求解为里说明双边滤波的实现原理:图像在 ( i , j ) (i,j) (i,j)处经过双边滤波后的输出像素值 g g g依赖于邻域内像素值f的加权组合。
g ( i , j ) = ∑ k , l f ( k , l ) w ( i , j , k , l ) ∑ k , l w ( i , j , k , l ) g(i, j)=\frac{\sum_{k, l} f(k, l) w(i, j, k, l)}{\sum_{k, l} w(i, j, k, l)} g(i,j)=k,lw(i,j,k,l)k,lf(k,l)w(i,j,k,l)
其中, k , l k,l k,l表示邻域像素的位置,权重系数 w ( i , j , k , l ) w(i,j,k,l) w(i,j,k,l)为空间域核d与值域核r的乘积。空间域核d是指基于高斯函数计算当前点与中心点的欧式距离。
d ( i , j , k , l ) = exp ⁡ ( − ( i − k ) 2 + ( j − l ) 2 2 σ d 2 ) d(i, j, k, l)=\exp \left(-\frac{(i-k)^2+(j-l)^2}{2 \sigma_d^2}\right) d(i,j,k,l)=exp(2σd2(ik)2+(jl)2)
值域核 r r r是指基于高斯函数计算当前点与中心点像素值的差的绝对值。
r ( i , j , k , l ) = exp ⁡ ( − ∥ f ( i , j ) − f ( k , l ) ∥ 2 2 σ r 2 ) r(i, j, k, l)=\exp \left(-\frac{\|f(i, j)-f(k, l)\|^2}{2 \sigma_r^2}\right) r(i,j,k,l)=exp(2σr2f(i,j)f(k,l)2)
由空间域核与值域核的计算公式可得权重系数的计算公式为:
w ( i , j , k , l ) = exp ⁡ ( − ( i − k ) 2 + ( j − l ) 2 2 σ d 2 − ∥ f ( i , j ) − f ( k , l ) ∥ 2 2 σ r 2 ) w(i, j, k, l)=\exp \left(-\frac{(i-k)^2+(j-l)^2}{2 \sigma_d^2}-\frac{\|f(i, j)-f(k, l)\|^2}{2 \sigma_r^2}\right) w(i,j,k,l)=exp(2σd2(ik)2+(jl)22σr2f(i,j)f(k,l)2)

2.2 双边滤波的matlab程序实现

双边滤波实现函数:

%适用于单通道图像的双边滤波程序

function B = Bilater_Gray(A,w,sigma_d,sigma_r)
         %输出参数:
         % A为待滤波图像(double类型,取值在[01]% w为滤波窗口的半径(e.g:3*3窗口的w值为1,w=3时的滤波效果较好)
         % sigma_d为定义域(空间域)核的方差,通常设置为3
         % sigma_r为值域核的方差,通常设置为0.1
         %输出参数:
         % B为滤波后的图像
% 预先计算高斯距离权重
[X,Y] = meshgrid(-w:w,-w:w);
%创建核距离矩阵,e.g.
%  [x,y]=meshgrid(-1:1,-1:1)
% 
% x =
% 
%     -1     0     1
%     -1     0     1
%     -1     0     1
% 
% 
% y =
% 
%     -1    -1    -1
%      0     0     0
%      1     1     1
%计算定义域核
G = exp(-(X.^2+Y.^2)/(2*sigma_d^2));


%计算值域核H 并与定义域核G 乘积得到双边权重函数F
dim = size(A);
B = zeros(dim);
for i = 1:dim(1)
   for j = 1:dim(2)

         % 确定作用区域
         iMin = max(i-w,1);
         iMax = min(i+w,dim(1));
         jMin = max(j-w,1);
         jMax = min(j+w,dim(2));
         %定义当前核所作用的区域为(iMin:iMax,jMin:jMax)
         I = A(iMin:iMax,jMin:jMax);%提取该区域的源图像值赋给I

         %计算值域核H.
         H = exp(-(I-A(i,j)).^2/(2*sigma_r^2));

         % Calculate bilateral filter response.
         F = H.*G((iMin:iMax)-i+w+1,(jMin:jMax)-j+w+1);
         %在计算边缘部分的点的时候H的大小会变化,例如在计算第一行第一列的点时,
         %H的大小为4*4,因为7*7的其余部分都在图像外面(没有对应的值)。
         %因此适当的对G进行裁切使得G的大小始终能和H对上
         B(i,j) = sum(F(:).*I(:))/sum(F(:));

   end
end

主程序中调用:

%双边滤波主程序
clear all;
close all;
clc;
% 输入图像
fname   = 'Images\lena.jpg';   %改成你要操作的图像
X = double(rgb2gray(imread(fname)))/255;
% 开始滤波
Y = Bilater_Gray(X,3,3,0.1);

%获取细节层,即:被过滤的部分
Z = X - Y;

%结果显示
figure; imshow(X,[]);
figure; imshow(Y,[]);
figure; imshow(Z,[]);
%因为Z中有负值,所以最终强制以图片的形式显示的时候为灰色(正常现象)

结果展示:

图1 双边滤波效果展示(从左到右依次是:原始图像、滤波后的图像、被过滤的图像细节)

三、导向滤波(Guided Fliter)

3.1 导向滤波的理论介绍及公式推导

导向滤波是由何凯明等人在2010年提出来的一种非线性空间滤波算法。它在继承了双边滤波良好的边缘保留特性的同时,克服了双边滤波在主要边缘附近存在梯度变形的问题。
可以将导向滤波的过程看作是一个普通的线性平移变换滤波模型。滤波模型的输入量为:输入图像 p p p,引导图像 I I I,经过滤波模型可得到滤波后的图像 q q q。在这一过程中,对于 i i i位置像素点的滤波操作可以被表达成一个加权平均:
q i = ∑ j W i j ( I ) p j q_i=\sum_j W_{i j}(I) p_j qi=jWij(I)pj
其中,i和j分别表示像素的下标。滤波核 W i j W_{i j} Wij只与引导图像I相关。滤波器 W i j ( I ) W_{ij} (I) Wij(I)与图像 p p p呈线性相关。引导图像 I I I是预先设定的,可以与 p p p保持一致。当 I = p I=p I=p时,导向滤波将退化为双边滤波。
假设输出图像 q q q是引导图像I的一个局部线性变换,即:在窗口 ω k ω_k ωk上, q q q I I I线性相关:
q i = a k I i + b k , ∀ i ∈ ω k q_i=a_k I_i+b_k, \quad \forall i \in \omega_k qi=akIi+bk,iωk
其中 ω k ω_k ωk是一个半径为r的方形局部化窗口,当 r r r为一个确定的常数值时, a k a_k ak b k b_k bk也将是一组确定的常系数。这保证了在一个局部区域里,如果引导图像 I I I存在边缘,输出图像 q q q也会保持引导图像的边缘特性。因为,对于边缘附近的像素点而言存在着 ∇ q = a ∇ I ∇q=a∇I q=aI。对于这个局部线性变换模型而言,求解出系数 a a a b b b即可得到输出图像 q q q。为了求解系数 a a a b b b,需要约束输入图像 p p p,这里将输入图像被滤波器过滤的部分记为 n n n
q i = p i − n i q_i=p_i-n_i qi=pini
为了在滤波的过程中极大程度的保留原始图像中的梯度信息,需要在保证线性模型的成立的前提下最小化 p p p q q q之间的差异。即:
argmin ⁡ ∑ i ∈ ω k ( q i − p i ) 2 argmin ⁡ ∑ i ∈ ω k ( a k I i + b k − p i ) 2 \begin{gathered} \operatorname{argmin} \sum_{i \in \omega_k}\left(q_i-p_i\right)^2 \\ \operatorname{argmin} \sum_{i \in \omega_k}\left(a_k I_i+b_k-p_i\right)^2 \end{gathered} argminiωk(qipi)2argminiωk(akIi+bkpi)2
在解决上式的最优化问题时,为防止 a k a_k ak过大引入一个正则化参数 ϵ ϵ ϵ,可得最小化滤波窗口的损失函数为:
E ( a k , b k ) = ∑ i ∈ ω k ( ( a k I i + b k − p i ) 2 + ϵ a k 2 ) E\left(a_k, b_k\right)=\sum_{i \in \omega_k}\left(\left(a_k I_i+b_k-p_i\right)^2+\epsilon a_k^2\right) E(ak,bk)=iωk((akIi+bkpi)2+ϵak2)
通过对参数求偏导的方法可以求解 a k a_k ak b k b_k bk
a k = 1 ∣ ω ∣ ∑ i ϵ ω k I i p i − μ k p ˉ k σ k 2 + ϵ b k = p ˉ k − a k μ k \begin{gathered} a_k=\frac{\frac{1}{|\omega|} \sum_{i \epsilon \omega_k} I_i p_i-\mu_k \bar{p}_k}{\sigma_k^2+\epsilon} \\ b_k=\bar{p}_k-a_k \mu_k \end{gathered} ak=σk2+ϵω1iϵωkIipiμkpˉkbk=pˉkakμk
其中, μ k μ_k μk σ k 2 σ_k^2 σk2分别代表引导图像 I I I在窗口 ω k ω_k ωk中的平均值和方差, p ˉ k \bar{p} _k pˉk表示输入图像p在窗口内像素的均值, ∣ ω ∣ |ω| ω代表窗口中的像素个数。

3.2 导向滤波matlab代码实现

导向滤波实现函数:

%导向滤波实现函数,适用于单通道图像
function q = Guided_filter(I, p, r, eps)
         %   时间复杂度为O(1).
         %输入参数:
         %   引导图像 I (double类型,取值为[01])
         %   待滤波图像 p (double类型,取值为[01])
         %   滤波窗口半径 r
         %   正则化参数: eps(可以取:0.2^2%输出参数:
         %   滤波后的图像q

[hei, wid] = size(I);
N = boxfilter(ones(hei, wid), r); %boxfilter是一个求窗口内所有元素的和的程序(程序实现方式见下一代码块)
                                  %因此N代表了图像I在半径为r的窗口内的像素个数

mean_I = boxfilter(I, r) ./ N;
mean_p = boxfilter(p, r) ./ N;
mean_Ip = boxfilter(I.*p, r) ./ N;
cov_Ip = mean_Ip - mean_I .* mean_p; % 求局部区域内的协方差,即ak表达式的分子部分

mean_II = boxfilter(I.*I, r) ./ N;
var_I = mean_II - mean_I .* mean_I;

a = cov_Ip ./ (var_I + eps); % 求ak;
b = mean_p - a .* mean_I;    % 求bk;

mean_a = boxfilter(a, r) ./ N;
mean_b = boxfilter(b, r) ./ N;

q = mean_a .* I + mean_b;    %求滤波结果q;
end

boxfilter函数:

%这是一个通用的求半径为r的滤波窗口内所有元素的和的函数。
%也可以用matlab自带的colfilt来实现
function imDst = boxfilter(imSrc, r)

%   BOXFILTER   O(1) time box filtering using cumulative sum
%
%   - Definition imDst(x, y)=sum(sum(imSrc(x-r:x+r,y-r:y+r)));
%   - Running time independent of r; 
%   - Equivalent to the function: colfilt(imSrc, [2*r+1, 2*r+1], 'sliding', @sum);
%   - But much faster.

[hei, wid] = size(imSrc);
imDst = zeros(size(imSrc));

%cumulative sum over Y axis
imCum = cumsum(imSrc, 1);
%difference over Y axis
imDst(1:r+1, :) = imCum(1+r:2*r+1, :);
imDst(r+2:hei-r, :) = imCum(2*r+2:hei, :) - imCum(1:hei-2*r-1, :);
imDst(hei-r+1:hei, :) = repmat(imCum(hei, :), [r, 1]) - imCum(hei-2*r:hei-r-1, :);

%cumulative sum over X axis
imCum = cumsum(imDst, 2);
%difference over Y axis
imDst(:, 1:r+1) = imCum(:, 1+r:2*r+1);
imDst(:, r+2:wid-r) = imCum(:, 2*r+2:wid) - imCum(:, 1:wid-2*r-1);
imDst(:, wid-r+1:wid) = repmat(imCum(:, wid), [1, r]) - imCum(:, wid-2*r:wid-r-1);
end


主程序调用:

%用于测试导向滤波的程序
close all;
fname_I   = 'Images\lena.jpg';   %改成你要操作的图像
fname_P   = 'Images\lena.jpg';   %改成你要操作的图像
%这里将引导图像设置成了原始图像,滤波效果会有所减弱
I = double(rgb2gray(imread(fname)))/255;
P = double(rgb2gray(imread(fname)))/255;

r = 2;
eps = 0.1^2;

q = Guided_filter(I, p, r, eps);

n = p - q;

%结果显示
figure; imshow(p,[]);  %原始图像
figure; imshow(q,[]);  %导向滤波后的图像
figure; imshow(n,[]);  %导向滤波过滤掉的图像的信息

在这里插入图片描述
图2 经过导向滤波过滤后的图像(图像展示顺序与图1的一致)

四、滚动导向滤波(RollingGuidedFilter)

4.1 滚动导向滤波的理论介绍及公式推导

滚动导向滤波是总结了双边滤波和导向滤波的经验后提出的一种新型的“两步滤波”,为了更好的说明它的设计出发点和它与前两种滤波的区别。我将在图像多尺度分解领域对其展开描述。
在图像滤波中(图像多尺度分解领域),双边滤波和导向滤波很好的发挥了边缘保持的特性,通过这两种滤波,图像的边缘特征已经能得到很大程度的保留。但是在实际的滤波过程中,单纯通过正向滤波过滤的过程仍然存在着错误识别和滤波过度的问题。简单来说就是将一些小尺度的边缘特征当作细节纹理过滤出去。
一个理想的滤波器是能够精确识别所有细节纹理然后将他们全部过滤,在这一过程不会存过滤过度或不足的情况。然而小尺度的细节纹理和边缘特征在像素构造上本身并没有太大区别,这就导致仅仅依靠正向操作的滤波器很难做到精准识别和选择性过滤。小尺度结构的保留问题亟需解决。
Qi Zhang等人在2014年提出了滚动导向滤波器,通过寻找尺度感知的方式极大程度的解决了这一问题。在这一问题的实际解决中,作者将这新型滤波器的设计追求定在过滤掉规定尺度下的所有细节纹理。
为了更好的理解滚动导向滤波的实现原理,先介绍细节纹理在图像中或在像素关系中处于的地位:一般来说图像中某一地方的像素与周围像素存在很大的像素值差异,那么存在这种差异的地方叫做震荡(像素值的高低),按照差异的大小分为高对比度/大结构/大震荡,低对比度/小结构/小震荡。震荡只是一种像素表现形式,按照图像的特征来看,震荡主要是图像纹理细节和边缘的反映。而纹理主要是小结构信息(因为长度短,通常所有的信息都能在一个滤波窗口中存下),边缘主要是大结构信息(比较长,一个滤波窗口不能完全存下,但在窗口中所有存在和体现)。
在确定了细节纹理和边缘信息的定义及二者在滤波窗口中的实际像素体现的区别后,现在的问题就变成了如何过滤小结构(细节纹理),但是要尽最大程度的不损伤大结构信息(边缘信息)。从单步处理来看,现有的滤波器存在的问题就是在滤波窗口内无法分辨出什么是细节,什么是边缘,也就是无法针对性的只过滤细节保留边缘。以滤波原理最简单的高斯滤波为例,在规定好滤波参数后,高斯滤波会将滤波窗口内所有符合过滤要求的振荡一并滤除。在这些振荡中有些是需要过滤的细节纹理,有些则是需要保留的边缘信息。
导向滤波要做的是只过滤所规定尺度的细节信息,不过滤边缘信息。传统的正向滤波(减法操作,从源图像中减去滤波器所认为的需要过滤的信息)很难实现,导向滤波的提出者们便另辟蹊径,提出了“现减后加”的理论模式。通过实际滤波结果,高斯滤波虽然将所有的振荡信息全部过滤,但对于大尺度(大于滤波上限)的(真正的)边缘信息高斯滤波只是过滤了一部分,也就是让它们变得模糊起来。那么可以先通过高斯滤波将细节纹理和特征信息全部过滤(减法),然后再用某种手段把被过滤的边缘信息加回来(加法),这样就实现了只过滤所规定尺度的细节信息,不过滤边缘信息的目标。
在加回边缘信息时就用到了高斯对于过滤不同尺度的边缘信息的不同表现这一现象,也就高斯滤波仅仅将大尺度边缘信息变得模糊,而不能彻底过滤。滚动导向滤波承袭导向滤波的设计思路,在滤波的过程中设置引导图像来完成自身的“加法”操作。经过高斯过滤后的引导图像中大尺度的边缘信息只是有所减弱,但还是存在的,用它去引导滤波核可以实现重点保护尺度信息(引导滤波核去保留边缘信息)。
总的来说只要是能在第一次(也是唯一的一次)高斯滤波中没有被彻底抹除的信息经过加边缘信息的操作最终都能被保存。而被保存(加回)的条件就是振荡的尺度要大于滤波尺度(这里讲的尺度可以理解为长度,纵深,是二维的占有面积的程度,和通常讲的特征强度不同)。传统的正向操作的滤波器是只要信息的振荡值大,不论尺度多大都能保存下来,但是RGF不同,RGF滤波的唯一条件就是尺度。因此RGF具有尺度感知特性,可以很好的探查小尺度边缘信息和细节纹理,不同于以往的任何滤波器。
下面给出滚动导向滤波的理论推导:
第一步:利用高斯滤波拆除小结构,实现细节信息和边缘结构的全部过滤。高斯滤波器为:
G ( p ) = 1 K p ∑ q ∈ N ( p ) exp ⁡ ( − ∥ p − q ∥ 2 2 σ s 2 ) I ( q ) K p = ∑ q ∈ N ( p ) exp ⁡ ( − ∥ p − q ∥ 2 2 σ s 2 ) \begin{aligned} &G(p)=\frac{1}{K_p} \sum_{q \in N(p)} \exp \left(-\frac{\|p-q\|^2}{2 \sigma_s^2}\right) I(q) \\ &K_p=\sum_{q \in N(p)} \exp \left(-\frac{\|p-q\|^2}{2 \sigma_s^2}\right) \end{aligned} G(p)=Kp1qN(p)exp(2σs2pq2)I(q)Kp=qN(p)exp(2σs2pq2)
其中输入图像为 I I I,输出图像为 G G G p p p q q q表示对应的图像像素坐标, σ s σ_s σs为标准差, N ( p ) N(p) N(p)表示以像素点 p p p为中心的滤波窗口。
第二步:迭代恢复边缘信息。以双边滤波核为滤波手段,通过迭代恢复边缘信息。迭代恢复的过程用公式表达为:
J t + 1 ( p ) = 1 K p ∑ q ∈ N ( p ) exp ⁡ ( − ∥ p − q ∥ 2 2 σ s 2 − ∥ J t ( p ) − J t ( q ) ∥ 2 2 σ r 2 ) I ( q ) K p = ∑ q ∈ N ( p ) exp ⁡ ( − ∥ p − q ∥ 2 2 σ s 2 − ∥ J t ( p ) − J t ( q ) ∥ 2 2 σ r 2 ) \begin{gathered} J^{t+1}(p)=\frac{1}{K_p} \sum_{q \in N(p)} \exp \left(-\frac{\|p-q\|^2}{2 \sigma_s^2}-\frac{\left\|J^t(p)-J^t(q)\right\|^2}{2 \sigma_r^2}\right) I(q) \\ K_p=\sum_{q \in N(p)} \exp \left(-\frac{\|p-q\|^2}{2 \sigma_s^2}-\frac{\left\|J^t(p)-J^t(q)\right\|^2}{2 \sigma_r^2}\right) \end{gathered} Jt+1(p)=Kp1qN(p)exp(2σs2pq22σr2Jt(p)Jt(q)2)I(q)Kp=qN(p)exp(2σs2pq22σr2Jt(p)Jt(q)2)
其中, J t + 1 J^{t+1} Jt+1表示为第

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三种经典图像滤波方法介绍——双边滤波(Bilateral filter)、导向滤波(Guided Fliter)、滚动导向滤波(RollingGuidedFilter) 的相关文章

  • 禁止 MATLAB 自动获取焦点[重复]

    这个问题在这里已经有答案了 我有以下问题 在我的 MATLAB 代码中 我使用如下语句 figure 1 更改某些数据的目标数字 问题是 在此 MATLAB 之后 系统将焦点集中在具有该图形的窗口上 当我在后台运行一个大脚本并尝试在计算机上
  • 在 Matlab 中保存 Kinect 深度图像?

    通过使用 Kinect 我可以获得深度图像 其中每个深度图像像素存储相机和物体之间的距离 以毫米为单位 现在我想保存它们以便以后使用 最好的推荐是什么 我正在考虑将深度图像保存为图像 jpg png等 然而 该值通常是从50毫米到10000
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • Matlab:2行10列的子图

    如何在 matlab 中绘制 20 幅图像 2 行 10 列 我知道我必须使用 子图 功能 但我对给出的参数感到困惑 我尝试给予 子图 2 10 行索引 列索引 但它似乎不起作用 请帮忙 的前两个参数subplot函数分别给出图中子图的总行
  • Mathworks 生成 Matlab HTML 文档的方法是什么?

    我正在开发共享的 Matlab 代码 我们希望在本地网络中将生成的文档作为可搜索的 HTML 文档共享 我知道以下生成文档的方法 编写一个类似于 C 文件的转换器 这是在中完成的将 Doxygen 与 Matlab 结合使用 http ww
  • 考虑预分配速度[重复]

    这个问题在这里已经有答案了 我正在做以下事情 for i 1 m index 0 for j 1 n index index values i j 2 j 1 if j 1 symbol chip chip values index 1 e
  • 使用不同的背景颜色保存 MATLAB 图窗

    我想打印一个带有深色背景和白色标签的 MATLAB 图 如果我使用print or saveas命令我不知何故失去了颜色 绘图符号再次变暗 背景变为白色 points rand 100 3 plot3 points 1 points 2 p
  • Matlab strcat 不返回字符串?

    imgstr 无法识别 strcat 的输出字符串 homedir C Users images for img 01 bmp 02 bmp 03 bmp imgstr strcat homedir img I imread imgstr
  • 霍夫变换检测和删除线

    我想使用霍夫变换检测图像中的线条 但是我不想绘制线条 而是想删除原始图像中检测到的每条线条 image imread image jpg image im2bw image BW edge image canny imshow BW fig
  • 在 MATLAB 图中用值标记点

    以下命令确实用正方形标记了点 但没有在其中放入值 例如 21 0 X 21 8 2 1 0 Y 0 1 2 3 4 plot X Y k s 我应该添加哪个参数以便全部5点值出现在图上吗 这些值不能一一键入 因为它们是随机数 因此它们可能会
  • 在 MATLAB 中验证输入的最佳实践

    在验证 MATLAB 函数中的输入时 什么时候使用 inputParser 比使用断言更好 或者还有其他更好的工具可用吗 我个人发现使用 inputParser 不必要地复杂 对于 Matlab 始终需要检查 3 项内容 存在 类型和范围
  • 计算向量的导数

    我有以下函数 维维亚尼曲线 Phi t cos t 2 cos t sin t sin t 只需检查它是否有效 s linspace 0 T 1000 plot3 cos s 2 cos s sin s sin s 如何推导函数Phi 可能
  • 使用网络计算机进行 Matlab 并行处理

    我熟悉matlabpool and parfor用法 但我仍然需要加快计算速度 我的 1GB 网络中有一台功能更强大的计算机 两台计算机都有 R2010b 并且具有相同的代码和路径 使用两台计算机进行并行计算的最简单方法是什么 我今天使用的
  • Matlab:如何读取以逗号作为小数分隔符的数字?

    我有很多 数十万 相当大 gt 0 5MB 的文件 其中数据是数字 但以逗号作为小数分隔符 使用像这样的外部工具对我来说是不切实际的sed s g 当分隔符是点时 我只使用textscan fid f f f 但我看不到更改小数点分隔符的选
  • matlab中简单正弦波的傅里叶变换

    我尝试显示简单正弦波的频谱 因为我们知道具有固定频率的单个正弦波必须在其频谱中出现峰值我编写了这段代码 但我无法得到这个峰值我的代码中有什么问题 clc nsteps 200 number of signal elements in tim
  • Matlab 错误:()-索引必须出现在索引表达式的最后

    我有这段代码 想要在制表符分隔的 txt 文件中写入一个数组 fid fopen oo txt wt for x 1 length s fprintf fid s t n s x 1 end fclose fid 但我收到此错误 Error
  • 了解 Matlab 中的 DEL2 函数以便用 C++ 对其进行编码

    为了用 C 编写 DEL2 matlab 函数 我需要了解该算法 我已经成功地为不在边界或边缘上的矩阵元素编写了函数 我已经看过几个有关它的主题 并通过输入 edit del2 或 type del2 来阅读 MATLAB 代码 但我不明白
  • MATLAB:MEX 矩阵除法给出的结果与 m 文件不同

    我使用 MATLAB 的编码器工具创建了矩阵指数函数的 MEX 版本 以在另一组函数中使用 问题是 MEX 版本给出的结果与原始 m 文件不同 经过调试 我认为这是因为MEX文件和m文件没有做相同的矩阵除法 或者 MEX 文件首先就有问题

随机推荐

  • 解决执行 spark.sql 时版本不兼容的一种方式

    场景描述 hive 数据表的导入导出功能部分代码如下所示 使用 assemble 将 Java 程序和 spark 相关依赖一起打成 jar 包 最后 spark submit 提交 jar 到集群执行 public class Spark
  • CRM--今日简报(接口实现)

    接口定义 按照开始时间和结束时间查询今日基本数据 线索数量 商机数量 合同数量 成交的金额 需求 当前用户在当前的线索数量 商机数量 合同数量 成交的金额 当前用户的线索 商机 合同 成交金额都不需要考虑状态 只要是今日做的 哪怕是回收了删
  • 移动FPGA使用Verilog图像处理verilator模拟和ice40执行

    概述 在verilog中实现简单的图像处理操作 该项目围绕一个中央图像处理模块 image processing v 展开 该模块可以包含在使用 verilator 的模拟环境中 也可以包含在 ice40 Ultraplus fpga 的
  • FLASH和EEPROM的区别和扩展

    EEPROM和FLASH总体差异 部分MCU片内不带程序存储器ROM 可执行代码只能放在外面的EEPROM FLASH 外扩 中 单片机对于数据的处理和系统的大量数据采集 需要考虑数据的长期保存和掉电保存等问题 因此外扩EEPROM就是这系
  • Scala-13:集合-列表List

    Scala 13 集合 列表List 一 不可变 List 1 说明 List 默认为不可变集合 创建一个 List 数据有顺序 可重复 List 默认为不可变集合 val list List Int List 1 2 3 4 3 遍历 L
  • 总结:js中Object.setPrototypeOf和Object.create的区别

    首先知道什么是原型 只要这样才能理解下面的内容 Object setPrototypeOf obj prototype 他是将prototype作为已知对象obj的原型 Object create prototype 是创建一个以proto
  • Java-动态代理原理

    1 什么是代理模式 1 例子 1 例子 在了解Java动态代理技术之前 先了解一下什么是代理模式 其实代理模式在生活中很常见 比如房东与中介其实就是一个代理的过程 房东有自己的房子 在代理模式中扮演角色是被代理对象 中介扮演角色是代理对象
  • java 行转列_Java程序员从阿里面试回来,这些面试题你们会吗?

    序言 简单的介绍一下自己的工作经历与职责 在校或者在工作中主要的工作内容 主要负责的内容 你的信息一清二白的写在简历上 这个主要为了缓解面试者的压力 介绍下自己最满意的 有技术亮点的项目或平台 重点介绍下自己负责那部分的技术细节 主要考察应
  • selenium爬虫与配置谷歌浏览器的driver问题

    用selenium爬虫时 明明已经安装了selenium模块 程序却运行不了 在使用selenium之前必须先配置浏览器对应版本的webdriver 本文主要涉及驱动有问题driver 网上有很多手动的方法 查看谷歌浏览的版本然后在其他博主
  • [ESP32]ESP32 Arduino BLE调试 / 与安卓蓝牙数据交互

    帖子导航 ESP32 ESP32 Arduino开发环境搭建 首先得有支持包吧 ESP32 BLE支持包 进入arduino IDE gt 文件 gt 首选项 gt 项目文件位置 到该路径下 打开git工具 项目地址 https githu
  • Python做的一个猜数字应用

    首先需求一共有五次猜测机会 在五次机会中才对就赢了 结束游戏 五次都猜错就输了 也结束游戏 首先先画个草图 这是我画的草图 再根据草图编写一个窗口 一个Label 一个Entry 一个按钮 然后编写功能 将功能绑定函数 import ran
  • Vue3基础(三)__isRef___isReactve

    isRef isRef方法通过vue解构出来 import isRef from vue 主要是为了判断自己生成的响应数据是否是通过isRef 方法生成的
  • elementui 之input 框总结

    1 elementUI的input框 需要用v model绑定一个变量 这个变量相当于原生input框的value 2 placeholder属性和原生的一样
  • centos7-docker安装redis

    1 docker 拉去redis镜像 docker pull redis 2 创建实例并启动 mkdir p mydata redis conf touch mydata redis conf redis conf docker run p
  • 计算机网络安全防范的论文,计算机网络安全防范策略毕业论文.doc

    计算机网络安全防范策略毕业论文 PAGE PAGE PAGE I 摘 要 信息技术的使用给人们的生活 工作带来了数不尽的便捷和好处 然而计算机信息技术也和其他技术一样是一把双刃剑 当大部分人们使用信息技术提高工作效率 为社会创造更多财富的同
  • oracle数据库下创建用户

    一 使用sqlplus 创建用户 1 登陆到sqlplus 2 键入 create user user name identified by password user name 要用户名 password 对应的密码 3 键入 Grant
  • v-loading

    使用v loading在接口为请求到数据之前 显示加载中 直到请求到数据后消失
  • OpenLayers - Vector绘制地图省市区(十)

    简介 本文讲解经常在开发中出现的功能 绘制地图省市区 主要使用Vector图层通过绘制多边行的方法 绘制出省市区的多边行 把该图层添加到地图图层上 就实现了绘制省市区图形 Vector 矢量图层 在客户端呈现的矢量数据 构成一个矢量图层需要
  • c++中的虚特性(虚基类、虚函数、纯虚函数)

    1 虚基类 1 1 虚基类作用 为了解决多继承时的命名冲突和冗余数据问题 使得派生类中只保留一份间接基类的成员 其本质是是让某个类做出声明 承诺愿意共享它的基类 其中 这个被共享的基类就称为虚基类 Virtual Base Class 换个
  • 三种经典图像滤波方法介绍——双边滤波(Bilateral filter)、导向滤波(Guided Fliter)、滚动导向滤波(RollingGuidedFilter)

    文章目录 一 前言 二 双边滤波 Bilateral filter 2 1 双边滤波的理论介绍及公式推导 2 2 双边滤波的matlab程序实现 三 导向滤波 Guided Fliter 3 1 导向滤波的理论介绍及公式推导 3 2 导向滤