void ccv_subtract(ccv_matrix_t* a, ccv_matrix_t* b, ccv_matrix_t** c, int type) { ccv_dense_matrix_t* da = ccv_get_dense_matrix(a); ccv_dense_matrix_t* db = ccv_get_dense_matrix(b); assert(da->rows == db->rows && da->cols == db->cols && CCV_GET_DATA_TYPE(da->type) == CCV_GET_DATA_TYPE(db->type) && CCV_GET_CHANNEL(da->type) == CCV_GET_CHANNEL(db->type)); ccv_declare_derived_signature(sig, da->sig != 0 && db->sig != 0, ccv_sign_with_literal("ccv_subtract"), da->sig, db->sig, CCV_EOF_SIGN); int no_8u_type = (da->type & CCV_8U) ? CCV_32S : da->type; type = (type == 0) ? CCV_GET_DATA_TYPE(no_8u_type) | CCV_GET_CHANNEL(da->type) : CCV_GET_DATA_TYPE(type) | CCV_GET_CHANNEL(da->type); ccv_dense_matrix_t* dc = *c = ccv_dense_matrix_renew(*c, da->rows, da->cols, CCV_ALL_DATA_TYPE | CCV_GET_CHANNEL(da->type), type, sig); ccv_object_return_if_cached(, dc); int i, j, ch = CCV_GET_CHANNEL(da->type); unsigned char* aptr = da->data.u8; unsigned char* bptr = db->data.u8; unsigned char* cptr = dc->data.u8; #define for_block(_for_get, _for_set) \ for (i = 0; i < da->rows; i++) \ { \ for (j = 0; j < da->cols * ch; j++) \ _for_set(cptr, j, _for_get(aptr, j, 0) - _for_get(bptr, j, 0), 0); \ aptr += da->step; \ bptr += db->step; \ cptr += dc->step; \ } ccv_matrix_getter(da->type, ccv_matrix_setter, dc->type, for_block); #undef for_block }
void ccv_close_outline(ccv_dense_matrix_t* a, ccv_dense_matrix_t** b, int type) { assert((CCV_GET_CHANNEL(a->type) == CCV_C1) && ((a->type & CCV_8U) || (a->type & CCV_32S) || (a->type & CCV_64S))); ccv_declare_derived_signature(sig, a->sig != 0, ccv_sign_with_literal("ccv_close_outline"), a->sig, CCV_EOF_SIGN); type = ((type == 0) || (type & CCV_32F) || (type & CCV_64F)) ? CCV_GET_DATA_TYPE(a->type) | CCV_C1 : CCV_GET_DATA_TYPE(type) | CCV_C1; ccv_dense_matrix_t* db = *b = ccv_dense_matrix_renew(*b, a->rows, a->cols, CCV_C1 | CCV_ALL_DATA_TYPE, type, sig); ccv_object_return_if_cached(, db); int i, j; unsigned char* a_ptr = a->data.u8; unsigned char* b_ptr = db->data.u8; ccv_zero(db); #define for_block(_for_get, _for_set_b, _for_get_b) \ for (i = 0; i < a->rows - 1; i++) \ { \ for (j = 0; j < a->cols - 1; j++) \ { \ if (!_for_get_b(b_ptr, j, 0)) \ _for_set_b(b_ptr, j, _for_get(a_ptr, j, 0), 0); \ if (_for_get(a_ptr, j, 0) && _for_get(a_ptr + a->step, j + 1, 0)) \ { \ _for_set_b(b_ptr + a->step, j, 1, 0); \ _for_set_b(b_ptr, j + 1, 1, 0); \ } \ if (_for_get(a_ptr + a->step, j, 0) && _for_get(a_ptr, j + 1, 0)) \ { \ _for_set_b(b_ptr, j, 1, 0); \ _for_set_b(b_ptr + a->step, j + 1, 1, 0); \ } \ } \ if (!_for_get_b(b_ptr, a->cols - 1, 0)) \ _for_set_b(b_ptr, a->cols - 1, _for_get(a_ptr, a->cols - 1, 0), 0); \ a_ptr += a->step; \ b_ptr += db->step; \ } \ for (j = 0; j < a->cols; j++) \ { \ if (!_for_get_b(b_ptr, j, 0)) \ _for_set_b(b_ptr, j, _for_get(a_ptr, j, 0), 0); \ } ccv_matrix_getter_integer_only(a->type, ccv_matrix_setter_getter_integer_only, db->type, for_block); #undef for_block }
void ccv_visualize(ccv_matrix_t* a, ccv_dense_matrix_t** b, int type) { ccv_dense_matrix_t* da = ccv_get_dense_matrix(a); ccv_declare_derived_signature(sig, da->sig != 0, ccv_sign_with_literal("ccv_visualize"), da->sig, CCV_EOF_SIGN); ccv_dense_matrix_t* db = *b = ccv_dense_matrix_renew(*b, da->rows, da->cols, CCV_8U | CCV_C1, CCV_8U | CCV_C1, sig); ccv_object_return_if_cached(, db); ccv_dense_matrix_t* dc = 0; if (CCV_GET_CHANNEL(da->type) > CCV_C1) { ccv_flatten(da, (ccv_matrix_t**)&dc, 0, 0); da = dc; } int i, j; double minval = DBL_MAX, maxval = -DBL_MAX; unsigned char* aptr = da->data.u8; unsigned char* bptr = db->data.u8; #define for_block(_, _for_get) \ for (i = 0; i < da->rows; i++) \ { \ for (j = 0; j < da->cols; j++) \ { \ minval = ccv_min(minval, _for_get(aptr, j, 0)); \ maxval = ccv_max(maxval, _for_get(aptr, j, 0)); \ } \ aptr += da->step; \ } \ aptr = da->data.u8; \ for (i = 0; i < da->rows; i++) \ { \ for (j = 0; j < da->cols; j++) \ bptr[j] = ccv_clamp((_for_get(aptr, j, 0) - minval) * 255.0 / (maxval - minval), 0, 255); \ aptr += da->step; \ bptr += db->step; \ } ccv_matrix_getter(da->type, for_block); #undef for_block if (dc != 0) ccv_matrix_free(dc); }