Преобразование изображения RGB в изображение HSI без использования функций opencv

0

Я как бы начинаю, когда дело доходит до c++ и opencv.

У меня есть это назначение, когда мне нужно успешно преобразовать изображение из RGB в HSI, а затем разделить изображение HSI на 3 канала Hue, Saturation и соответственно Intensity, без использования каких-либо функций библиотеки при реализации моего алгоритма, после чего 3 изображения должны будет отображаться.

Я смог сделать большинство из них, но при переходе из RGB в HSI я полностью потерял. Из того, что я видел на других постах, значения пикселей должны быть помещены в матрицу, а затем изменены на основе моих алгоритмов, после чего новые значения должны перейти в новую матрицу (HSI).

Моя основная проблема (я думаю) заключается в том, что я не могу представить значения в новую матрицу, я пробовал разные методы, но результат был таким же.

Любой вход приветствуется.

С наилучшими пожеланиями, Стефан

#include <opencv\highgui.h>
#include <opencv\cv.h>
#include <iostream> 
using namespace cv;
using namespace std;

int main()
{
Mat rgb;

rgb = imread("Flower.jpg", CV_LOAD_IMAGE_COLOR);

unsigned char *input = (unsigned char*)(rgb.data);

Mat hsi = rgb.clone();

double R,G,B,a,H,S,I;
int  i,j;
const double PI= 3.14;
for(int i = 0;i < hsi.rows ;i++){
    for(int j = 0;j < hsi.cols ;j++){
        B = input[hsi.step * j + i ];
        G = input[hsi.step * j + i + 1];
        R = input[hsi.step * j + i + 2];
    }

    if (R < G && R < B)
        a = R;
    if (G < R && G < B)
        a = G;
    if (B < G && B < R)
        a = B;
    I = (R+G+B)/3.0;
    S = 1 - 3.0/(R+G+B)*a;
    if (S == 0.0)
    {
        H = 0.0;
    }
    else
    {
        if (B <= G)
        H = acos((((R-G)+(R-B))/2.0)/(sqrt((R-G)*(R-G) + (R-B)*(G-B))));
        else
        {
            if (B > G)
            H = 2*PI - acos((((R-G)+(R-B))/2.0)/(sqrt((R-G)*(R-G) + (R-B)*(G-B))));
        }


    }
}

namedWindow("RGB", CV_WINDOW_AUTOSIZE);
imshow("RGB", rgb);
namedWindow("HSI", CV_WINDOW_AUTOSIZE);
imshow("HSI", hsi);     

waitKey(0);
return 0;
}
Теги:
opencv
image

1 ответ

0
Лучший ответ

У вашего кода две проблемы.

Во-первых, вы выполняете вычисление вне второго цикла:

for(int i = 0;i < hsi.rows ;i++){
    for(int j = 0;j < hsi.cols ;j++){
    }
    // HSI calculation
}  

Таким образом, вы работаете только с последним пикселем в каждой строке.

Во-вторых, вы не записываете результаты в hsi матрицу.

Используйте этот шаблон кода:

Mat bgr = ...; // OpenCV uses BGR format
Mat hsi(bgr.size(), CV_8UC3);
for (int i = 0; i < bgr.rows; ++i)
{
    const Vec3b* bgr_row = bgr.ptr<Vec3b>();
    Vec3b* hsi_row = hsi.ptr<Vec3b>();
    for (int j = 0; j < bgr.cols; ++j)
    {
        double B = bgr_row[j][0];
        double G = bgr_row[j][1];
        double R = bgr_row[j][2];
        double H = ...;
        double S = ...;
        double I = ...;
        hsi_row[j] = Vec3b(H, S, I);
    }
}
  • 0
    Спасибо за помощь, мне удалось заставить его работать, используя ваш шаблон, но я не могу использовать какие-либо функции при реализации моих алгоритмов, поэтому я не могу использовать 'CV_8UC3'. Вы дали мне идею, и мне все же удалось заставить ее работать. Я опубликую это, как только закончу. Спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню