我正在尝试在Matlab中进行斑点检测。如何摆脱Flood_fill()中的无限递归。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Auth;
use DB;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
public function allusers()
{
$key['key'] = DB::table('users')->get();
return view('allusers',$key);
}
}
由于无限递归,它卡在此函数中。我应该怎么做才能在正确的时间爆发。
Auth::routes();
Route::group(['middleware' => ['web','auth']],function(){
Route::get('/', function () {
return view('welcome');
});
Route::get('/home', function(){
if (Auth::user()->admin==0) {
return view('home');
}
else {
$users['users'] = \App\User::all();
return view('adminhome', $users);
}
});
});
答案 0 :(得分:2)
我现在看到了问题:您正在将I
传递给函数,但没有取回修改。 MATLAB按值传递所有参数(句柄类除外)。这意味着函数可以更改其输入参数,而无需更改调用者工作区中这些矩阵的值。您需要修改flood_fill
函数以返回I
。
另一个问题是blobs
是一个逻辑数组,为其分配任何非零值将产生一个值1。您需要将其强制转换为其他类型,或者将其与{{1}一起加倍}或以下特定整数类型。
这是更正的代码:
+blobs
还请注意,在双循环中,将变化最快的索引作为内部循环是有益的。 MATLAB是主要列,因此在blobs = im2bw(imread('Week6Image.jpg'),0.1);
blobs = uint16(blobs); % or uint32 if you have many regions
[W, H] = size(blobs);
out = region_labeling(blobs,W,H);
function I = region_labeling(I,W,H)
label = 2;
for u = 1 : W
%For loop vertical Axis
for v = 1 : H
if I(u,v) == 1
I = flood_fill(I,u,v,label,W,H);
label = label + 1;
end
end
end
end
function I = flood_fill(I,u,v,label,W,H)
if u >= 1 && u <= W && v >= 1 && v <= H && I(u,v) == 1
I(u,v) = label;
I = flood_fill(I,u+1,v,label,W,H);
I = flood_fill(I,u,v+1,label,W,H);
I = flood_fill(I,u,v-1,label,W,H);
I = flood_fill(I,u-1,v,label,W,H);
end
end
中,I(u,v)
是变化最快的索引。因此,理想情况下,您应该将两个for循环互换。但是,鉴于这是一种速度较慢的算法,并且MATLAB在递归方面效率不高,因此您可能看不到这部分代码的区别。