zoukankan      html  css  js  c++  java
  • 5. 把一幅彩色图像的H、S、I分量单独显示。

    #include <cv.h>
    #include <highgui.h> 
    # include <math.h>
    #define M_PI 3.1415
    void RGB_to_HSI(IplImage *src, IplImage *dst);
    int main(void)
    {
        IplImage * oo  = cvLoadImage   ("6013202130.jpg", 1);
        IplImage * xx  = cvCreateImage  (cvGetSize(oo), 8, 1);
        RGB_to_HSI(oo, xx);
        cvNamedWindow("原图", 1);
        cvNamedWindow("HSI", 1);
        cvShowImage("原图", oo);
        cvShowImage("HSI" , xx);
        cvWaitKey(0);
        cvReleaseImage(&xx);
        cvReleaseImage(&oo);
        return 0;
    }
    
    void RGB_to_HSI(IplImage *src, IplImage *dst)
    {
        int i, j;
        double b, g, r, numm, den, min, theta, H, S, I;
        CvScalar s0;
        for (i = 0; i<src->height; i++)
        for (j = 0; j<src->width; j++)
        {
    
            s0 = cvGet2D(src, i, j);
            b = s0.val[0] / 255;//rgb归一化
            g = s0.val[1] / 255;
            r = s0.val[2] / 255;
            //几何推导法转换
            numm = 0.5*((r - g) + (r - b));
            den = sqrt((r - g)*(r - g) + (r - b)*(g - b));
            if (den == 0)
                H = 0;
            else
            {
                theta = acos(numm / den);
                if (b>g)
                    H = (2 * M_PI - theta) / (2 * M_PI);
                else
                    H = theta / (2 * M_PI);
            }
            min = (b>g) ? g : b;
            min = (min>r) ? r : min;
            den = r + g + b;
            if (den == 0)
                S = 0;
            else
                S = 1 - 3 * min / den;
            I = (r + g + b) / 3;
            cvSet2D(dst, i, j, cvScalar(H * 180, S * 255, I * 255));
        }
    }

  • 相关阅读:
    C#如何连接wifi和指定IP
    3.4 小结
    3.3.4.5 起始与清除
    3.3.4.4 打印行
    3.3.4.3 设置字段分隔字符
    3.3.4.2 字段
    3.3.4.1 模式与操作
    3.3.4 使用 awk 重新编排字段
    3.3.3 使用 join 连接字段
    3.3.2 使用 cut 选定字段
  • 原文地址:https://www.cnblogs.com/zhangfeionline/p/5465190.html
Copyright © 2011-2022 走看看