در حالت colorize شما فقط hue که کاربر مشخص می نماید را جایگزین hue تصویر نهایی می نمایید ولی در حالت معمولی offset را که کاربر می دهد با hue موجو در تصویر جمع می کنید در ضمن بازه hue از 0 تا 180 بوده و به صورت چرخشی یعنی اگر مقدار hue محاسبه شده از 180 بیشتر باشد باید از 180 کسر گردد.مقدار saturation و intensity باید به صورت uchar در آنها saturation cast صورت بگیرد.
void hueSaturationIntensity2(InputArray _src, OutputArray _dst, int hue, int saturation, int intensity,bool colorize){
if (!(_src.depth() == CV_8U && (_src.channels() == 3 || _src.channels() == 4)))
return;
Mat src = _src.getMat();
if (_dst.empty() || _src.size() != _dst.size())
_dst.create(_src.size(), _src.type());
Mat dst = _dst.getMat();
Mat hsv_src;
cvtColor(src, hsv_src, CV_BGR2HSV);
src.copyTo(dst);
for (int y = 0; y < hsv_src.rows; y++){
uchar* hsv_row = hsv_src.ptr<uchar>(y);
uchar* dst_row = dst.ptr<uchar>(y);
int xx = 0;
for (int x = 0; x < hsv_src.cols; x++){
int hue_v ;
if (!colorize)
hue_v = (hsv_row[xx] + hue) % 180;
else hue_v = hue % 180;
while (hue_v < 0)
hue_v = 180 + hue_v;
dst_row[xx++] = uchar( hue_v);
dst_row[xx++] = saturate_cast<uchar>(hsv_row[xx] + saturation);
dst_row[xx++] = saturate_cast<uchar>(hsv_row[xx] + intensity);
if (src.channels() == 4)
xx++;
}
}
cvtColor(dst, dst, CV_HSV2BGR);
}