diff --git a/demo/smoothing.ipynb b/demo/smoothing.ipynb new file mode 100644 index 00000000..65205634 --- /dev/null +++ b/demo/smoothing.ipynb @@ -0,0 +1,410 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 29, + "id": "eb73de20-5c0d-4cae-836c-ee3e240cad68", + "metadata": {}, + "outputs": [], + "source": [ + "import pyclesperanto_prototype as cle\n", + "import numpy as np\n", + "from skimage.segmentation.morphsnakes import sup_inf, inf_sup" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "ff3849b7", + "metadata": {}, + "source": [ + "### 2D test" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "abc572bf", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "array = np.zeros((100, 100), dtype=np.uint8)\n", + "array[15:85, 15:85] = 1\n", + "array[35:65, 35:65] = 0\n", + "cle.imshow(array)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "560a1217", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pyclesperanto\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Pyclesperanto\")\n", + "array_smooth = cle.superior_inferior(cle.inferior_superior(array))\n", + "cle.imshow(array_smooth)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "480d0014", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Scikit-image\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print(\"Scikit-image\")\n", + "array_smooth_ref = sup_inf(inf_sup(array))\n", + "cle.imshow(array_smooth_ref)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "48e384da", + "metadata": {}, + "source": [ + "### 3D test" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "d418a958", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]]\n", + "\n", + " [[0. 0. 0. 0. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 0. 0. 0. 0.]]\n", + "\n", + " [[0. 0. 0. 0. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 0. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 0. 0. 0. 0.]]\n", + "\n", + " [[0. 0. 0. 0. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 0. 0. 0. 0.]]\n", + "\n", + " [[0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0.]]]\n" + ] + } + ], + "source": [ + "array3d = np.zeros((5, 5, 5))\n", + "array3d[1:4, 1:4, 1:4] = 1\n", + "array3d[2, 2, 2] = 0\n", + "print(array3d)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "3d2b5f2f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pyclesperanto\n", + "\n", + "[[[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 1 1 1 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]]\n" + ] + } + ], + "source": [ + "print(\"Pyclesperanto\\n\")\n", + "print(cle.superior_inferior(cle.inferior_superior(array3d)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "9c25d0db", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Scikit-image\n", + "\n", + "[[[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 1 1 1 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]]\n" + ] + } + ], + "source": [ + "print(\"Scikit-image\\n\")\n", + "print(sup_inf(inf_sup(array3d)))" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "9d4e616a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[[0. 0. 0. 0. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 0. 0. 0. 0.]]\n", + "\n", + " [[0. 0. 0. 0. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 0. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 0. 0. 0. 0.]]\n", + "\n", + " [[0. 0. 0. 0. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 1. 1. 1. 0.]\n", + " [0. 0. 0. 0. 0.]]]\n" + ] + } + ], + "source": [ + "array3d = np.zeros((3, 5, 5))\n", + "array3d[:, 1:4, 1:4] = 1\n", + "array3d[1, 2, 2] = 0\n", + "print(array3d)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "90c85d91", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pyclesperanto\n", + "\n", + "[[[0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 1 1 1 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 1 1 1 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 1 1 1 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]]]\n" + ] + } + ], + "source": [ + "print(\"Pyclesperanto\\n\")\n", + "print(cle.superior_inferior(cle.inferior_superior(array3d)))" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "226f18fe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Scikit-image\n", + "\n", + "[[[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 1 1 1 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]]\n", + "\n", + " [[0 0 0 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 1 0 0]\n", + " [0 0 0 0 0]\n", + " [0 0 0 0 0]]]\n" + ] + } + ], + "source": [ + "print(\"Scikit-image\\n\")\n", + "print(sup_inf(inf_sup(array3d)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0b63e2d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cle_39", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.16" + }, + "vscode": { + "interpreter": { + "hash": "a77a85fb3f9351cc5c809eebe289f69647bd4ccab6f00793c7ad5e93a0cdb95e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyclesperanto_prototype/_tier1/__init__.py b/pyclesperanto_prototype/_tier1/__init__.py index 7323b6e8..fea0556a 100644 --- a/pyclesperanto_prototype/_tier1/__init__.py +++ b/pyclesperanto_prototype/_tier1/__init__.py @@ -68,6 +68,7 @@ from ._greater_or_equal import greater_or_equal from ._greater_or_equal_constant import greater_or_equal_constant from ._hessian_eigenvalues import hessian_eigenvalues +from ._inferior_superior import inferior_superior from ._laplace_box import laplace_box from ._laplace_diamond import laplace_diamond from ._logarithm import logarithm @@ -161,6 +162,7 @@ from ._sum_x_projection import sum_x_projection from ._sum_y_projection import sum_y_projection from ._sum_z_projection import sum_z_projection +from ._superior_inferior import superior_inferior from ._transpose_xy import transpose_xy from ._transpose_xz import transpose_xz from ._transpose_yz import transpose_yz diff --git a/pyclesperanto_prototype/_tier1/_inferior_superior.py b/pyclesperanto_prototype/_tier1/_inferior_superior.py new file mode 100644 index 00000000..0b339ccf --- /dev/null +++ b/pyclesperanto_prototype/_tier1/_inferior_superior.py @@ -0,0 +1,36 @@ +from .._tier0 import execute, create_binary_like +from .._tier0 import plugin_function +from .._tier0 import Image + +@plugin_function(categories=['binary processing'], output_creator=create_binary_like) +def inferior_superior(source : Image, destination : Image = None) -> Image: + """Dilates the image respectively with a number of kernels and takes the minimum + value across all results for each pixel. + + Parameters + ---------- + source : Image + destination : Image, optional + + Returns + ------- + destination + + Examples + -------- + >>> import pyclesperanto_prototype as cle + >>> cle.inferior_superior(source, destination) + + References + ---------- + Implemented in inf_sup function in scikit morphological snakes: + .. [1] https://github.com/scikit-image/scikit-image/blob/00177e14097237ef20ed3141ed454bc81b308f82/skimage/segmentation/morphsnakes.py + """ + + parameters = { + "src":source, + "dst":destination + } + + execute(__file__, './inferior_superior_' + str(len(destination.shape)) + 'd_x.cl', 'inferior_superior_' + str(len(destination.shape)) + 'd', destination.shape, parameters) + return destination diff --git a/pyclesperanto_prototype/_tier1/_superior_inferior.py b/pyclesperanto_prototype/_tier1/_superior_inferior.py new file mode 100644 index 00000000..e8d10ba5 --- /dev/null +++ b/pyclesperanto_prototype/_tier1/_superior_inferior.py @@ -0,0 +1,36 @@ +from .._tier0 import execute, create_binary_like +from .._tier0 import plugin_function +from .._tier0 import Image + +@plugin_function(categories=['binary processing'], output_creator=create_binary_like) +def superior_inferior(source : Image, destination : Image = None) -> Image: + """Erodes the image respectively with a number of kernels and takes the maximum + value across all results for each pixel. + + Parameters + ---------- + source : Image + destination : Image, optional + + Returns + ------- + destination + + Examples + -------- + >>> import pyclesperanto_prototype as cle + >>> cle.inferior_superior(source, destination) + + References + ---------- + Implemented in sup_inf function in scikit morphological snakes: + .. [1] https://github.com/scikit-image/scikit-image/blob/00177e14097237ef20ed3141ed454bc81b308f82/skimage/segmentation/morphsnakes.py + """ + + parameters = { + "src":source, + "dst":destination + } + + execute(__file__, './superior_inferior_' + str(len(destination.shape)) + 'd_x.cl', 'superior_inferior_' + str(len(destination.shape)) + 'd', destination.shape, parameters) + return destination diff --git a/pyclesperanto_prototype/_tier1/inferior_superior_2d_x.cl b/pyclesperanto_prototype/_tier1/inferior_superior_2d_x.cl new file mode 100644 index 00000000..819b0930 --- /dev/null +++ b/pyclesperanto_prototype/_tier1/inferior_superior_2d_x.cl @@ -0,0 +1,71 @@ +__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; + +__kernel void inferior_superior_2d ( + IMAGE_src_TYPE src, + IMAGE_dst_TYPE dst +) +{ + const int x = get_global_id(0); + const int y = get_global_id(1); + + const int2 pos = (int2){x,y}; + + float value = READ_src_IMAGE(src, sampler, pos).x; + + // if value is already 1, dilate will return 1 + if (value == 1) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + /* Dilate with kernel [[1, 0, 0], + [0, 1, 0], + [0, 0, 1]] */ + value = READ_src_IMAGE(src, sampler, (pos + (int2){1, 1})).x; + if (value == 0) { + value = READ_src_IMAGE(src, sampler, (pos + (int2){-1, -1})).x; + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + } + + /* Dilate with kernel [[0, 1, 0], + [0, 1, 0], + [0, 1, 0]] */ + value = READ_src_IMAGE(src, sampler, (pos + (int2){0, 1})).x; + if (value == 0) { + value = READ_src_IMAGE(src, sampler, (pos + (int2){0, -1})).x; + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + } + + /* Dilate with kernel [[0, 0, 1], + [0, 1, 0], + [1, 0, 0]] */ + value = READ_src_IMAGE(src, sampler, (pos + (int2){-1, 1})).x; + if (value == 0) { + value = READ_src_IMAGE(src, sampler, (pos + (int2){1, -1})).x; + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + } + + /* Dilate with kernel [[0, 0, 0], + [1, 1, 1], + [0, 0, 0]] */ + value = READ_src_IMAGE(src, sampler, (pos + (int2){1, 0})).x; + if (value == 0) { + value = READ_src_IMAGE(src, sampler, (pos + (int2){-1, 0})).x; + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + } + + // If all dilates are 1 then return 1 + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); +} \ No newline at end of file diff --git a/pyclesperanto_prototype/_tier1/inferior_superior_3d_x.cl b/pyclesperanto_prototype/_tier1/inferior_superior_3d_x.cl new file mode 100644 index 00000000..77e198ab --- /dev/null +++ b/pyclesperanto_prototype/_tier1/inferior_superior_3d_x.cl @@ -0,0 +1,181 @@ +__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; + +__kernel void inferior_superior_3d ( + IMAGE_src_TYPE src, + IMAGE_dst_TYPE dst +) +{ + const int x = get_global_id(0); + const int y = get_global_id(1); + const int z = get_global_id(2); + + const int4 pos = (int4){x, y, z, 0}; + + float value = READ_src_IMAGE(src, sampler, pos).x; + + // if value is already 0, erode will return 0 + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // printf("pixel at coord x%i y%i z%i\n", x, y, z); + + + // P0 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, j, 0, 0})).x; + // printf("value %i\n", value); + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // P1 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, 0, j, 0})).x; + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // P2 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){0, i, j, 0})).x; + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // P3 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, j, j, 0})).x; + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // P4 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){j, i, -i, 0})).x; + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // P5 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, j, i, 0})).x; + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // P6 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, j, -i, 0})).x; + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // P7 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, i, j, 0})).x; + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // P8 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, -i, j, 0})).x; + if (value != 0) { + break; + } + } + if (value != 0) { + break; + } + } + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // If all erodes are 0 then return 0 + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); +} \ No newline at end of file diff --git a/pyclesperanto_prototype/_tier1/superior_inferior_2d_x.cl b/pyclesperanto_prototype/_tier1/superior_inferior_2d_x.cl new file mode 100644 index 00000000..cc051b92 --- /dev/null +++ b/pyclesperanto_prototype/_tier1/superior_inferior_2d_x.cl @@ -0,0 +1,71 @@ +__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; + +__kernel void superior_inferior_2d ( + IMAGE_src_TYPE src, + IMAGE_dst_TYPE dst +) +{ + const int x = get_global_id(0); + const int y = get_global_id(1); + + const int2 pos = (int2){x,y}; + + float value = READ_src_IMAGE(src, sampler, pos).x; + + // if value is already 0, erode will return 0 + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + /* Erode with kernel [[1, 0, 0], + [0, 1, 0], + [0, 0, 1]] */ + value = READ_src_IMAGE(src, sampler, (pos + (int2){1, 1})).x; + if (value != 0) { + value = READ_src_IMAGE(src, sampler, (pos + (int2){-1, -1})).x; + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + } + + /* Erode with kernel [[0, 1, 0], + [0, 1, 0], + [0, 1, 0]] */ + value = READ_src_IMAGE(src, sampler, (pos + (int2){0, 1})).x; + if (value != 0) { + value = READ_src_IMAGE(src, sampler, (pos + (int2){0, -1})).x; + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + } + + /* Erode with kernel [[0, 0, 1], + [0, 1, 0], + [1, 0, 0]] */ + value = READ_src_IMAGE(src, sampler, (pos + (int2){-1, 1})).x; + if (value != 0) { + value = READ_src_IMAGE(src, sampler, (pos + (int2){1, -1})).x; + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + } + + /* Erode with kernel [[0, 0, 0], + [1, 1, 1], + [0, 0, 0]] */ + value = READ_src_IMAGE(src, sampler, (pos + (int2){1, 0})).x; + if (value != 0) { + value = READ_src_IMAGE(src, sampler, (pos + (int2){-1, 0})).x; + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + } + + // If all erodes are 0 then return 0 + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); +} \ No newline at end of file diff --git a/pyclesperanto_prototype/_tier1/superior_inferior_3d_x.cl b/pyclesperanto_prototype/_tier1/superior_inferior_3d_x.cl new file mode 100644 index 00000000..9b8cf260 --- /dev/null +++ b/pyclesperanto_prototype/_tier1/superior_inferior_3d_x.cl @@ -0,0 +1,181 @@ +__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; + +__kernel void superior_inferior_3d ( + IMAGE_src_TYPE src, + IMAGE_dst_TYPE dst +) +{ + const int x = get_global_id(0); + const int y = get_global_id(1); + const int z = get_global_id(2); + + const int4 pos = (int4){x, y, z, 0}; + + float value = READ_src_IMAGE(src, sampler, pos).x; + + // if value is already 0, erode will return 0 + if (value == 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); + return; + } + + // printf("pixel at coord x%i y%i z%i\n", x, y, z); + + + // P0 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, j, 0, 0})).x; + // printf("value %i\n", value); + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // P1 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, 0, j, 0})).x; + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // P2 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){0, i, j, 0})).x; + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // P3 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, j, j, 0})).x; + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // P4 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){j, i, -i, 0})).x; + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // P5 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, j, i, 0})).x; + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // P6 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, j, -i, 0})).x; + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // P7 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, i, j, 0})).x; + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // P8 + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + value = READ_src_IMAGE(src, sampler, (pos + (int4){i, -i, j, 0})).x; + if (value == 0) { + break; + } + } + if (value == 0) { + break; + } + } + if (value != 0) { + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(1)); + return; + } + + // If all erodes are 0 then return 0 + WRITE_dst_IMAGE(dst, pos, CONVERT_dst_PIXEL_TYPE(0)); +} \ No newline at end of file diff --git a/tests/test_inferior_superior.py b/tests/test_inferior_superior.py new file mode 100644 index 00000000..5d89c3f0 --- /dev/null +++ b/tests/test_inferior_superior.py @@ -0,0 +1,90 @@ +import pyclesperanto_prototype as cle +import numpy as np + + +def test_inferior_superior_2d(): + test = cle.push(np.asarray([ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ])) + + reference = cle.push(np.asarray([ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 0, 0, 1, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 1, 0, 0, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ])) + + result = cle.create(test) + cle.inferior_superior(test, result) + + print(result) + + a = cle.pull(result) + b = cle.pull(reference) + assert (np.array_equal(a, b)) + + +def test_inferior_superior_3d(): + test = cle.push(np.asarray([[ + [0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0]], + + [[0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 0, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0]], + + [[0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0] + ]])) + + reference = cle.push(np.asarray([[ + [0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0]], + + [[0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0]], + + [[0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0] + ]])) + + result = cle.create(test) + cle.inferior_superior(test, result) + + print(result) + + a = cle.pull(result) + b = cle.pull(reference) + assert (np.array_equal(a, b)) \ No newline at end of file diff --git a/tests/test_superior_inferior.py b/tests/test_superior_inferior.py new file mode 100644 index 00000000..f3ce0443 --- /dev/null +++ b/tests/test_superior_inferior.py @@ -0,0 +1,90 @@ +import pyclesperanto_prototype as cle +import numpy as np + + +def test_superior_inferior_2d(): + test = cle.push(np.asarray([ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ])) + + reference = cle.push(np.asarray([ + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 1, 1, 1, 1, 1, 0, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 0, 0, 0, 0, 1, 1, 0], + [0, 1, 1, 1, 1, 1, 1, 1, 1, 0], + [0, 0, 1, 1, 1, 1, 1, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + ])) + + result = cle.create(test) + cle.superior_inferior(test, result) + + print(result) + + a = cle.pull(result) + b = cle.pull(reference) + assert (np.array_equal(a, b)) + + +def test_superior_inferior_3d(): + test = cle.push(np.asarray([ + [0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0]], + + [[0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 0, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0]], + + [[0, 0, 0, 0, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 1, 1, 1, 0], + [0, 0, 0, 0, 0] + ])) + + reference = cle.push(np.asarray([ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0]], + + [[0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 1, 0, 1, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0]], + + [[0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0] + ])) + + result = cle.create(test) + cle.inferior_superior(test, result) + + print(result) + + a = cle.pull(result) + b = cle.pull(reference) + assert (np.array_equal(a, b)) \ No newline at end of file