Image<Bgr, Byte> srcimg = new Image<Bgr, byte>(inputImageName);
Image<Bgr, Byte> grayimg = new Image<Bgr, byte>(5619, 4381);
double red, blue, green, gray;
for (int i = 0; i < img.Height; i++)
for (int j = 0; j < img.Width; j++)
{
gray = srcimg[i, j].Blue * 0.11 + srcimg[i, j].Red * 0.3 + srcimg[i, j].Green * 0.59;
red = (img[i, j].Red + gray) > 255 ? 255 : img[i, j].Red + gray;
green = (img[i, j].Green + gray) > 255 ? 255 : img[i, j].Green + gray;
blue = (img[i, j].Blue + gray) > 255 ? 255 : img[i, j].Blue + gray;
srcimg[i, j] = new Bgr(red, green, blue);
grayimg[i, j] = new Bgr(gray, gray, gray);
}
CvInvoke.cvSaveImage("grayimg.tif", grayimg);
CvInvoke.cvSaveImage("imgimg.tif", img);
CvInvoke.cvSaveImage(saveImgName, img + grayimg);
H[i, j] = (srcimg[i, j].Green - srcimg[i, j].Blue) / (3 * (srcimg[i, j].Red + srcimg[i, j].Green - 2 * srcimg[i, j].Blue));
H[i, j] = ((srcimg[i, j].Blue - srcimg[i, j].Red) / (srcimg[i, j].Red + srcimg[i, j].Green - 2 * srcimg[i, j].Blue)) + 1 / 3;
H[i, j] = (srcimg[i, j].Red - srcimg[i, j].Green) / (srcimg[i, j].Red + srcimg[i, j].Green - 2 * srcimg[i, j].Blue) + 2 / 3;