对于c ++和opencv,我是一个初学者。
我有这个任务,我必须成功地将图像从RGB转换为HSI然后将HSI图像分成3个通道色调,饱和度和强度,在实现我的算法时不使用任何库函数,之后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;
}
答案 0 :(得分: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);
}
}