/ / Середня серед вокселів 3x3x3 у об'ємі 192x192x24 - зображення, MATLAB, обробка зображень, воксель

Середнє за воксель 3x3x3 у об'ємі 192x192x24 - зображення, MATLAB, обробка зображень, воксель

Я обробляю файли зображень з виміромінтенсивність, в основному витягання вокселів розмірами 1x1x1 пікселів. Файли зображень формують об'єм, щоб уникнути пікових інтенсивностей. Я хотів би знайти спосіб перевершити 3x3x3 пікселя.

Моя проблема полягає в тому, щоб зіткнутися з проблемою, оскільки вона є формою всередині зображення, розділеного нулями та іншими значеннями. Отже, спочатку я розглянув а for-лапа з а if-твердження Це міркування, які я зробив до цього часу для for-лоп і if-твердження MATLAB сприймає гучність як довгу матрицю так просто for цикл має бути легко знайти ненульове значення та його сусідні значення та прийняти середнє за ці значення. Проблема виникає, коли потрібно врахувати розмір z.

Це, безумовно, не працює оптимально, і мені важко врахувати граничні ефекти.

Відповіді:

6 за відповідь № 1

Я сподіваюся, що я правильно тлумачу ваше питання, алеви хочете визначити середній товщину вокселю 3 x 3 x 3 для кожного вокселя у вхідному зображенні, де кожен вхідний воксель діє як центр кожного 3 x 3 x 3 вокселю, який буде усереднений. Якщо у вас є можливість використовувати вбудовані функції MATLAB, подумайте про використання згортки N-D з convn. Не використовуйте петлі тут, тому що це буде значно повільним convn, першим параметром є 3D-зображення, а такожДругий параметр - це ядра 3 x 3 x 3 зі значеннями, які дорівнюють 1/27. Ви також можете вказати, що відбувається вздовж кордону, якщо ядро ​​згортка виходить за межі вхідного зображення. Зазвичай ви хочете повернути вихідне зображення, яке має такий же розмір, що й вхідний, і тому ви можете вказати "same" прапор як третій необов'язковий параметр. Цей механізм усереднення також передбачає, що зовнішні кромки мають нульовий простір.

Тому припущення вашого зображення зберігається в im, робіть щось на зразок цього:

%// Create kernel of all 1/27 in a 3 x 3 x 3 matrix
kernel = ones(3,3,3);
kernel = kernel / numel(kernel);

%// Perform N-D convolution
out = convn(double(im), kernel, "same"); %// Cast to double for precision

out = cast(out, class(im)); %// Recast back to original data type

Крім того, якщо ви маєте доступ до панелі інструментів обробки зображень, використовуйте imfilter замість цього. Різниця з цим і convn чи це imfilter був написаний з використанням Intel Integrated Primitives (IIPP), і, таким чином, продуктивність, безумовно, буде швидше:

%// Create kernel of all 1/27 in a 3 x 3 x 3 matrix
kernel = ones(3,3,3);
kernel = kernel / numel(kernel);

%// Perform N-D convolution
out = imfilter(im, kernel);

Додатковий бонус полягає в тому, що вам не потрібно змінювати тип введення. imfilter автоматично вимикає це, чи обробка відповідає оригінальному типу вхідного зображення та типу виводу imfilter такий самий, як і тип вводу. З convn, перш ніж використовувати його, слід переконатися, що ваші дані є плаваючою точкою.