Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Why does my own implementation of color conversion differ from cv::cvtColor() ?

Hi. I have implemented a little function to convert CV_8UC3 (bgr) to CV_8UC1 grayscale using formula provided with cv::cvtColor() docs : GRAY = 0.114 * B + 0.587f *G + 0.299f * R

Though output of my func is quite similar to one of cv::cvtColor(BGR2Gray), when checking each pixel's value in loop discovers lots of bad pixels. What is wrong ?

My function is below:

void bgr2gray(cv::Mat& src, cv::Mat& dst) { CV_Assert(!src.empty());

int width = src.cols;
int height = src.rows;
int channels = src.channels();

CV_Assert(src.channels() == 3 && dst.channels() == 1);
CV_Assert(width == dst.cols && height == dst.rows);
CV_Assert(src.isContinuous() && dst.isContinuous());


// src.isContinious() && dst.isContinious()
width *= height;
height = 1;

uchar* p_src;
uchar* p_dst;

for (int i = 0; i < height; i++) {
    p_src = src.ptr<uchar>(i);
    p_dst = dst.ptr<uchar>(i);
    for (int j = 0; j < width * channels; j += 3) {
        float d_gray(0.114F * p_src[j] + 0.587f * p_src[j + 1] + 0.299f * p_src[j + 2]);
        uchar gray = (uchar)d_gray;

        if (gray - d_gray >= 0.5f)
            gray += 1;

        p_dst[j / 3] = gray;
    }
  }
    }