1
0
Fork 0
mirror of https://github.com/ruby-opencv/ruby-opencv synced 2023-03-27 23:22:12 -04:00

add Mat#median_blur!

This commit is contained in:
ser1zw 2017-04-30 04:21:09 +09:00
parent 35c696fe1f
commit 18c3df7871
4 changed files with 57 additions and 6 deletions

View file

@ -1256,6 +1256,7 @@ namespace rubyopencv {
rb_define_method(rb_klass, "gaussian_blur", RUBY_METHOD_FUNC(rb_gaussian_blur), -1); // in ext/opencv/mat_imgproc.cpp rb_define_method(rb_klass, "gaussian_blur", RUBY_METHOD_FUNC(rb_gaussian_blur), -1); // in ext/opencv/mat_imgproc.cpp
rb_define_method(rb_klass, "gaussian_blur!", RUBY_METHOD_FUNC(rb_gaussian_blur_bang), -1); // in ext/opencv/mat_imgproc.cpp rb_define_method(rb_klass, "gaussian_blur!", RUBY_METHOD_FUNC(rb_gaussian_blur_bang), -1); // in ext/opencv/mat_imgproc.cpp
rb_define_method(rb_klass, "median_blur", RUBY_METHOD_FUNC(rb_median_blur), 1); // in ext/opencv/mat_imgproc.cpp rb_define_method(rb_klass, "median_blur", RUBY_METHOD_FUNC(rb_median_blur), 1); // in ext/opencv/mat_imgproc.cpp
rb_define_method(rb_klass, "median_blur!", RUBY_METHOD_FUNC(rb_median_blur_bang), 1); // in ext/opencv/mat_imgproc.cpp
rb_define_method(rb_klass, "threshold", RUBY_METHOD_FUNC(rb_threshold), 3); // in ext/opencv/mat_imgproc.cpp rb_define_method(rb_klass, "threshold", RUBY_METHOD_FUNC(rb_threshold), 3); // in ext/opencv/mat_imgproc.cpp
rb_define_method(rb_klass, "adaptive_threshold", RUBY_METHOD_FUNC(rb_adaptive_threshold), 5); // in ext/opencv/mat_imgproc.cpp rb_define_method(rb_klass, "adaptive_threshold", RUBY_METHOD_FUNC(rb_adaptive_threshold), 5); // in ext/opencv/mat_imgproc.cpp

View file

@ -407,6 +407,13 @@ namespace rubyopencv {
return self; return self;
} }
cv::Mat* rb_median_blur_internal(VALUE self, VALUE ksize, cv::Mat* destptr) {
cv::Mat* selfptr = obj2mat(self);
cv::medianBlur(*selfptr, *destptr, NUM2INT(ksize));
return destptr;
}
/* /*
* Blurs an image using the median filter. * Blurs an image using the median filter.
* *
@ -417,18 +424,32 @@ namespace rubyopencv {
* @opencv_func cv::medianBlur * @opencv_func cv::medianBlur
*/ */
VALUE rb_median_blur(VALUE self, VALUE ksize) { VALUE rb_median_blur(VALUE self, VALUE ksize) {
cv::Mat* selfptr = obj2mat(self); cv::Mat* destptr = new cv::Mat();
cv::Mat* dstptr = NULL;
try { try {
dstptr = new cv::Mat(); rb_median_blur_internal(self, ksize, destptr);
cv::medianBlur(*selfptr, *dstptr, NUM2INT(ksize));
} }
catch (cv::Exception& e) { catch (cv::Exception& e) {
delete dstptr; delete destptr;
Error::raise(e); Error::raise(e);
} }
return mat2obj(dstptr, CLASS_OF(self)); return mat2obj(destptr, CLASS_OF(self));
}
/*
* @overload median_blur!(ksize)
* @see #median_blur
*/
VALUE rb_median_blur_bang(VALUE self, VALUE ksize) {
cv::Mat* destptr = obj2mat(self);
try {
rb_median_blur_internal(self, ksize, destptr);
}
catch (cv::Exception& e) {
Error::raise(e);
}
return self;
} }
/* /*

View file

@ -21,6 +21,7 @@ namespace rubyopencv {
VALUE rb_gaussian_blur(int argc, VALUE *argv, VALUE self); VALUE rb_gaussian_blur(int argc, VALUE *argv, VALUE self);
VALUE rb_gaussian_blur_bang(int argc, VALUE *argv, VALUE self); VALUE rb_gaussian_blur_bang(int argc, VALUE *argv, VALUE self);
VALUE rb_median_blur(VALUE self, VALUE ksize); VALUE rb_median_blur(VALUE self, VALUE ksize);
VALUE rb_median_blur_bang(VALUE self, VALUE ksize);
VALUE rb_threshold(VALUE self, VALUE threshold, VALUE max_value, VALUE threshold_type); VALUE rb_threshold(VALUE self, VALUE threshold, VALUE max_value, VALUE threshold_type);
VALUE rb_adaptive_threshold(VALUE self, VALUE max_value, VALUE adaptive_method, VALUE rb_adaptive_threshold(VALUE self, VALUE max_value, VALUE adaptive_method,
VALUE threshold_type, VALUE block_size, VALUE delta); VALUE threshold_type, VALUE block_size, VALUE delta);

View file

@ -523,6 +523,34 @@ class TestCvMat < OpenCVTestCase
# snap(['Original', m], ['Median blur', m2]) # snap(['Original', m], ['Median blur', m2])
end end
def test_median_blur_bang
m0 = Cv::Mat.ones(3, 3, Cv::CV_8U)
m0[1, 1] = Cv::Scalar.new(0)
m1 = m0.clone
m1.median_blur!(3)
assert_equal(m0.class, m1.class)
assert_equal(m0.rows, m1.rows)
assert_equal(m0.depth, m1.depth)
assert_equal(m0.dims, m1.dims)
assert_equal(m0.channels, m1.channels)
m1.rows.times { |r|
m1.cols.times { |c|
assert_equal(1, m1[r, c][0].to_i)
}
}
assert_raise(TypeError) {
m0.median_blur(DUMMY_OBJ)
}
# m = Cv::imread(FILENAME_LENA256x256, -1)
# m2 = m.clone
# m2.median_blur!(9)
# snap(['Original', m], ['Median blur', m2])
end
def test_threshold def test_threshold
m0 = Cv::Mat.zeros(2, 2, Cv::CV_8U) m0 = Cv::Mat.zeros(2, 2, Cv::CV_8U)
m0[0, 0] = Cv::Scalar.new(10) m0[0, 0] = Cv::Scalar.new(10)