/******************************************************* * Copyright (c) 2014, ArrayFire * All rights reserved. * * This file is distributed under 3-clause BSD license. * The complete license agreement can be obtained at: * http://arrayfire.com/licenses/BSD-3-Clause ********************************************************/ #include #include #include #include #include #include #include #include using std::string; using std::vector; using std::abs; using af::dim4; template void bilateralTest(string pTestFile) { if (noDoubleTests()) return; if (noImageIOTests()) return; vector inDims; vector inFiles; vector outSizes; vector outFiles; readImageTests(pTestFile, inDims, inFiles, outSizes, outFiles); size_t testCount = inDims.size(); for (size_t testId=0; testId(string(TEST_DIR"/bilateral/gray.test")); } TEST(BilateralOnImage, Color) { bilateralTest(string(TEST_DIR"/bilateral/color.test")); } template class BilateralOnData : public ::testing::Test { }; typedef ::testing::Types DataTestTypes; // register the type list TYPED_TEST_CASE(BilateralOnData, DataTestTypes); template void bilateralDataTest(string pTestFile) { if (noDoubleTests()) return; typedef typename cond_type::value, double, float>::type outType; vector numDims; vector > in; vector > tests; readTests(pTestFile, numDims, in, tests); af::dim4 dims = numDims[0]; af_array outArray = 0; af_array inArray = 0; outType *outData; ASSERT_EQ(AF_SUCCESS, af_create_array(&inArray, &(in[0].front()), dims.ndims(), dims.get(), (af_dtype)af::dtype_traits::af_type)); ASSERT_EQ(AF_SUCCESS, af_bilateral(&outArray, inArray, 2.25f, 25.56f, false)); outData = new outType[dims.elements()]; ASSERT_EQ(AF_SUCCESS, af_get_data_ptr((void*)outData, outArray)); for (size_t testIter=0; testIter currGoldBar = tests[testIter]; size_t nElems = currGoldBar.size(); ASSERT_EQ(true, compareArraysRMSD(nElems, &currGoldBar.front(), outData, 0.02f)); } // cleanup delete[] outData; ASSERT_EQ(AF_SUCCESS, af_release_array(inArray)); ASSERT_EQ(AF_SUCCESS, af_release_array(outArray)); } TYPED_TEST(BilateralOnData, Rectangle) { bilateralDataTest(string(TEST_DIR"/bilateral/rectangle.test")); } TYPED_TEST(BilateralOnData, Rectangle_Batch) { bilateralDataTest(string(TEST_DIR"/bilateral/rectangle_batch.test")); } TYPED_TEST(BilateralOnData, InvalidArgs) { if (noDoubleTests()) return; vector in(100,1); af_array inArray = 0; af_array outArray = 0; // check for color image bilateral af::dim4 dims = af::dim4(100,1,1,1); ASSERT_EQ(AF_SUCCESS, af_create_array(&inArray, &in.front(), dims.ndims(), dims.get(), (af_dtype) af::dtype_traits::af_type)); ASSERT_EQ(AF_ERR_SIZE, af_bilateral(&outArray, inArray, 0.12f, 0.34f, true)); ASSERT_EQ(AF_SUCCESS, af_release_array(inArray)); } // C++ unit tests TEST(Bilateral, CPP) { if (noDoubleTests()) return; using af::array; vector numDims; vector > in; vector > tests; readTests(string(TEST_DIR"/bilateral/rectangle.test"), numDims, in, tests); af::dim4 dims = numDims[0]; array a(dims, &(in[0].front())); array b = af::bilateral(a, 2.25f, 25.56f, false); float *outData = new float[dims.elements()]; b.host(outData); for (size_t testIter=0; testIter currGoldBar = tests[testIter]; size_t nElems = currGoldBar.size(); ASSERT_EQ(true, compareArraysRMSD(nElems, &currGoldBar.front(), outData, 0.02f)); } // cleanup delete[] outData; } TEST(bilateral, GFOR) { using namespace af; dim4 dims = dim4(10, 10, 3); array A = iota(dims); array B = constant(0, dims); gfor(seq ii, 3) { B(span, span, ii) = bilateral(A(span, span, ii), 3, 5); } for(int ii = 0; ii < 3; ii++) { array c_ii = bilateral(A(span, span, ii), 3, 5); array b_ii = B(span, span, ii); ASSERT_EQ(max(abs(c_ii - b_ii)) < 1E-5, true); } }