使用递归泛洪填充的Matlab图像斑点检测

时间:2018-12-08 06:00:19

标签: matlab recursion image-processing computer-vision flood-fill

我正在尝试在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);
        }

    });
});

1 个答案:

答案 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在递归方面效率不高,因此您可能看不到这部分代码的区别。