/*! 市松模様を書き込む @param[in,out] img 書き込み先 3or4 ch @param[in] color1 色1 rgb @param[in] color2 色2 rgb @param[in] block_size 模様のブロックサイズ 2^(block_size)の大きさになる @param[in] lprc 書き込み先範囲 */ void CheckerImageRect(IplImage* img, const UCvPixel* color1, const UCvPixel* color2, int block_size, LPRECT lprc) { assert( img->nChannels == 3 || img->nChannels == 4 ); RECT rc; if(lprc){ rc.left = (lprc->left < lprc->right) ? lprc->left : lprc->right; rc.right = (lprc->left < lprc->right) ? lprc->right : lprc->left; rc.top = (lprc->top < lprc->bottom) ? lprc->top : lprc->bottom; rc.bottom = (lprc->top < lprc->bottom) ? lprc->bottom : lprc->top; } else{ rc.left = 0; rc.right = img->width; rc.top = 0; rc.bottom = img->height; } if (rc.right - rc.left == 0) return; if (rc.bottom - rc.top == 0) return; if(img->nChannels == 4){ int m, n; int x, y; UCvPixel *pix; UCvPixel *line = GetPixelAddress32(img, rc.left, rc.top); for(y=rc.top; y<rc.bottom; y++){ n = y >> block_size; pix = line; for(x=rc.left; x<rc.right; x++){ m = x >> block_size; if((n&0x1) == (m&0x1)){ pix->value = color1->value; } else{ pix->value = color2->value; } pix++; } line = GetNextLineAddress32(img, line); } }
_EXPORT double GetMaxAbsDiff(const IplImage* img1, const IplImage* img2) { assert(img1->width == img2->width); assert(img1->height == img2->height); assert(img1->nChannels == img2->nChannels); if (img1->nChannels == 4) { double max_abs_diff = 0.0; int x,y; UCvPixel* pix1; UCvPixel* pix2; UCvPixel* line1; UCvPixel* line2; line1 = GetPixelAddress32(img1, 0, 0); line2 = GetPixelAddress32(img2, 0, 0); for (y = 0; y < img1->height; y++) { pix1 = line1; pix2 = line2; for (x = 0; x < img1->width; x++) { int dif_b = pix1->b - pix2->b; int dif_g = pix1->g - pix2->g; int dif_r = pix1->r - pix2->r; int dif_a = pix1->a - pix2->a; dif_b *= ((double)max(pix1->a, pix2->a)/255.0); dif_g *= ((double)max(pix1->a, pix2->a)/255.0); dif_r *= ((double)max(pix1->a, pix2->a)/255.0); double abs_diff = sqrt((double)(dif_b*dif_b + dif_g*dif_g + dif_r*dif_r + dif_a*dif_a)); if (abs_diff > max_abs_diff) { max_abs_diff = abs_diff; } pix1++; pix2++; } line1 = GetNextLineAddress32(img1, line1); line2 = GetNextLineAddress32(img2, line2); } return max_abs_diff; } else if (img1->nChannels == 3) { double max_abs_diff = 0.0; int x,y; UCvBGR* pix1; UCvBGR* pix2; UCvBGR* line1; UCvBGR* line2; line1 = GetPixelAddress24(img1, 0, 0); line2 = GetPixelAddress24(img2, 0, 0); for (y = 0; y < img1->height; y++) { pix1 = line1; pix2 = line2; for (x = 0; x < img1->width; x++) { int dif_b = pix1->b - pix2->b; int dif_g = pix1->g - pix2->g; int dif_r = pix1->r - pix2->r; double abs_diff = sqrt((double)(dif_b*dif_b + dif_g*dif_g + dif_r*dif_r)); if (abs_diff > max_abs_diff) { max_abs_diff = abs_diff; } pix1++; pix2++; } line1 = GetNextLineAddress24(img1, line1); line2 = GetNextLineAddress24(img2, line2); } return max_abs_diff; } else if (img1->nChannels == 1) { double max_abs_diff = 0.0; int x,y; uint8_t* pix1; uint8_t* pix2; uint8_t* line1; uint8_t* line2; line1 = GetPixelAddress(img1, 0, 0); line2 = GetPixelAddress(img2, 0, 0); for (y = 0; y < img1->height; y++) { pix1 = line1; pix2 = line2; for (x = 0; x < img1->width; x++) { int dif = (*pix1) - (*pix2); double abs_diff = sqrt((double)dif*dif); if (abs_diff > max_abs_diff) { max_abs_diff = abs_diff; } pix1++; pix2++; } line1 = GetNextLineAddress(img1, line1); line2 = GetNextLineAddress(img2, line2); } return max_abs_diff; } else { assert(0); } }