void ColorSpace::GraytoRGB (const Mat& gray, Mat& color) { if (gray.Channels()==3) { color.Create (gray, TRUE); return; } if (gray.SizeObject() != color.SizeObject() || color.Channels()==3) { color.Release(); color.Create (gray.SizeObject(), (TYPE)CVLIB_MAKETYPE(gray.Type(), 3)); } int nH = color.Rows(), nW = color.Cols(); int elemsize=CVLIB_ELEM_SIZE(gray.Type()); for (int i = 0; i < nH; i ++) { uchar* pcolor=color.data.ptr[i]; uchar* pgray=gray.data.ptr[i]; for (int k=0; k<nW; k++) { memcpy (&pcolor[3*k*elemsize], &pgray[k*elemsize], elemsize); memcpy (&pcolor[(3*k+1)*elemsize], &pgray[k*elemsize], elemsize); memcpy (&pcolor[(3*k+2)*elemsize], &pgray[k*elemsize], elemsize); } } }
void ColorSpace::RGBtoHSV (const Mat& src, Mat& dst) { dst.Create (src.SizeObject(), MAT_Tfloat3); BYTE* pbyte = src.data.ptr[0]; float* pfloat = dst.data.fl[0]; int d=0; for (int i=0; i<src.SizeObject().Area(); i++, d+=3) RGBtoHSV(pbyte[d], pbyte[d+1], pbyte[d+2], &pfloat[d], &pfloat[d+1], &pfloat[d+2]); }
void ColorSpace::Split (const Mat& color, Mat& x, Mat& y, Mat& z) { x.Create (color.SizeObject(), color.Type()); y.Create (color.SizeObject(), color.Type()); z.Create (color.SizeObject(), color.Type()); int d=0; int cn=color.Channels(); uchar* pcolor=color.data.ptr[0]; uchar* px=x.data.ptr[0]; uchar* py=y.data.ptr[0]; uchar* pz=z.data.ptr[0]; for (int i=0; i<color.SizeObject().Area(); i++, d+=cn) { px[i]=pcolor[d]; py[i]=pcolor[d+1]; pz[i]=pcolor[d+2]; } }
void ColorSpace::RGBtoGray (const Mat& colorImg, Mat& mgray) { if (colorImg.Channels()==1) { mgray.Create (colorImg, TRUE); return; } if (mgray.SizeObject() != colorImg.SizeObject() || mgray.Channels()==3) { mgray.Release(); mgray.Create (colorImg.SizeObject(), colorImg.Type()); } int nH = colorImg.Rows(), nW = colorImg.Cols(); for (int i = 0; i < nH; i ++) { uchar* pcolor=colorImg.data.ptr[i]; uchar* pgray=mgray.data.ptr[i]; for (int j = 0, k=0; k<nW; j+=3, k++) pgray[k] = (uchar)((299 * pcolor[j] + 587 * pcolor[j+1] + 114 * pcolor[j+2]) / 1000); } }
void ColorSpace::BGRAtoRGB(const Mat& color1, Mat& color2) { color2.Create (color1.Rows(), color1.Cols(), MAT_TBYTE3); int d=0; uchar* psrc=color1.data.ptr[0]; uchar* pdst=color2.data.ptr[0]; int datalen=color1.Rows()*color1.Cols()*3; for (int i=0; i<datalen; i+=3, d+=4) { pdst[i]=psrc[d+2]; pdst[i+1]=psrc[d+1]; pdst[i+2]=psrc[d]; } }