From 509159ecca2a7558b0b30a179b2faddbeeec6e8c Mon Sep 17 00:00:00 2001 From: purewind7 <757419920@qq.com> Date: Wed, 20 Jul 2022 14:52:22 +0800 Subject: [PATCH] Add adaptive threshold --- package/PikaCV/PikaCV.pyi | 9 +++- package/PikaCV/PikaCV_Transforms.c | 43 +++++++++++++++++++ port/linux/package/pikascript/PikaCV.pyi | 9 +++- .../pikascript-lib/PikaCV/PikaCV_Transforms.c | 43 +++++++++++++++++++ port/linux/test/PikaCV-test.cpp | 15 +++++++ .../linux/test/python/PikaCV/PikaCV_test10.py | 7 +++ 6 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 port/linux/test/python/PikaCV/PikaCV_test10.py diff --git a/package/PikaCV/PikaCV.pyi b/package/PikaCV/PikaCV.pyi index 302411594..8feb19073 100644 --- a/package/PikaCV/PikaCV.pyi +++ b/package/PikaCV/PikaCV.pyi @@ -138,7 +138,14 @@ class Transforms(TinyObj): TODO: 1:BILINEAR """ - + def adaptiveThreshold(image:Image,maxval:int,subsize:int,c:int,method:int): + """ + AdaptiveThreshold + method + 0:meanFilter + 1:medianFilter + #TODO 2:gaussianFilter + """ class Filter(TinyObj): """The Filter class is used to supply some Image Filtering Algorithms .""" diff --git a/package/PikaCV/PikaCV_Transforms.c b/package/PikaCV/PikaCV_Transforms.c index 12af4dff4..4bc388c95 100644 --- a/package/PikaCV/PikaCV_Transforms.c +++ b/package/PikaCV/PikaCV_Transforms.c @@ -1,5 +1,6 @@ #include "PikaCV_Transforms.h" #include "PikaCV_Converter.h" +#include "PikaCV_Filter.h" #include "PikaCV_common.h" #include "math.h" @@ -254,3 +255,45 @@ void PikaCV_Transforms_resize(PikaObj *self, PikaObj* image, int resizeType, int #undef MAX #undef MIN + +void PikaCV_Transforms_adaptiveThreshold(PikaObj *self, int c, PikaObj* image, int maxval, int method, int subsize){ + PikaCV_Image* src = obj_getStruct(image, "image"); + + if (NULL == src) { + pika_assert(0); + return; + } + if(c<-255||c>255){ + pika_assert(0); + return; + } + if (src->format != PikaCV_ImageFormat_Type_GRAY) { + PikaCV_Converter_toGray(self,image); + } + + int size = src->size; + uint8_t* src_data = _image_getData(image); + + switch (method) + { + case 0: + PikaCV_Filter_meanFilter(self,image,subsize,subsize); //均值滤波 + break; + case 1: + PikaCV_Filter_medianFilter(self,image); //中值滤波 + break; + default: + break; + } + + uint8_t* smooth_data = _image_getData(image); + for(int i=0;i smooth_data[i] ? maxval : 0 ; + } + + obj_setBytes(image, "_data", src_data, src->size); + +} diff --git a/port/linux/package/pikascript/PikaCV.pyi b/port/linux/package/pikascript/PikaCV.pyi index 302411594..8feb19073 100644 --- a/port/linux/package/pikascript/PikaCV.pyi +++ b/port/linux/package/pikascript/PikaCV.pyi @@ -138,7 +138,14 @@ class Transforms(TinyObj): TODO: 1:BILINEAR """ - + def adaptiveThreshold(image:Image,maxval:int,subsize:int,c:int,method:int): + """ + AdaptiveThreshold + method + 0:meanFilter + 1:medianFilter + #TODO 2:gaussianFilter + """ class Filter(TinyObj): """The Filter class is used to supply some Image Filtering Algorithms .""" diff --git a/port/linux/package/pikascript/pikascript-lib/PikaCV/PikaCV_Transforms.c b/port/linux/package/pikascript/pikascript-lib/PikaCV/PikaCV_Transforms.c index 12af4dff4..4bc388c95 100644 --- a/port/linux/package/pikascript/pikascript-lib/PikaCV/PikaCV_Transforms.c +++ b/port/linux/package/pikascript/pikascript-lib/PikaCV/PikaCV_Transforms.c @@ -1,5 +1,6 @@ #include "PikaCV_Transforms.h" #include "PikaCV_Converter.h" +#include "PikaCV_Filter.h" #include "PikaCV_common.h" #include "math.h" @@ -254,3 +255,45 @@ void PikaCV_Transforms_resize(PikaObj *self, PikaObj* image, int resizeType, int #undef MAX #undef MIN + +void PikaCV_Transforms_adaptiveThreshold(PikaObj *self, int c, PikaObj* image, int maxval, int method, int subsize){ + PikaCV_Image* src = obj_getStruct(image, "image"); + + if (NULL == src) { + pika_assert(0); + return; + } + if(c<-255||c>255){ + pika_assert(0); + return; + } + if (src->format != PikaCV_ImageFormat_Type_GRAY) { + PikaCV_Converter_toGray(self,image); + } + + int size = src->size; + uint8_t* src_data = _image_getData(image); + + switch (method) + { + case 0: + PikaCV_Filter_meanFilter(self,image,subsize,subsize); //均值滤波 + break; + case 1: + PikaCV_Filter_medianFilter(self,image); //中值滤波 + break; + default: + break; + } + + uint8_t* smooth_data = _image_getData(image); + for(int i=0;i smooth_data[i] ? maxval : 0 ; + } + + obj_setBytes(image, "_data", src_data, src->size); + +} diff --git a/port/linux/test/PikaCV-test.cpp b/port/linux/test/PikaCV-test.cpp index daa174cac..73fb742f6 100644 --- a/port/linux/test/PikaCV-test.cpp +++ b/port/linux/test/PikaCV-test.cpp @@ -132,5 +132,20 @@ TEST(PikaCV, test9) { /* deinit */ obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); +} + +TEST(PikaCV, test10) { + /* init */ + pikaMemInfo.heapUsedMax = 0; + PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain); + /* run */ + __platform_printf("BEGIN\r\n"); + pikaVM_runSingleFile(pikaMain, "test/python/PikaCV/PikaCV_test10.py"); + /* collect */ + /* assert */ + /* deinit */ + obj_deinit(pikaMain); + EXPECT_EQ(pikaMemNow(), 0); } \ No newline at end of file diff --git a/port/linux/test/python/PikaCV/PikaCV_test10.py b/port/linux/test/python/PikaCV/PikaCV_test10.py new file mode 100644 index 000000000..3adf4e1c5 --- /dev/null +++ b/port/linux/test/python/PikaCV/PikaCV_test10.py @@ -0,0 +1,7 @@ +import PikaCV as cv +img = cv.Image() +img.read("test/assets/test.jpg") +cv.Converter.toGray(img) +cv.Transforms.adaptiveThreshold(img,255,3,0,0) +cv.Converter.toBMP(img) +img.write("test/out/test10.bmp")