[問題] HSI RGB轉換
將圖從RGB轉HSI 再從HSI轉回RGB
程式曾經轉出正確的圖(就HSI轉RGB再轉回來的圖是一樣的)
但加入HE後就變怪了
就算去掉HE的部分 出來的圖還是不對
我有帶值下去跑過 輸入的值跟輸出的值一樣 可是圖就是不對
還把錯誤的圖的值讀進去 竟然還會跟正確的圖一樣.......
我覺得問題應該是出在"強制轉換"的地方
請問要怎麼解決呢?? 拜託了 >"< 感謝
附上程式碼
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
using namespace std;
#define width 512
#define height 512
#define pi 3.14159
void read_file(unsigned char* r_data, unsigned char *g_data, unsigned char*
b_data)
{
FILE *fd;
fd = fopen("lena.raw", "rb");
static char data[width*height*3];
fread(data, sizeof(data) ,sizeof(unsigned char), fd);
for (int i=0; i<width*height; i++)
{
r_data[i] = data[i];
g_data[i] = data[i+width*height];
b_data[i] = data[i+width*height*2];
}
fclose(fd);
}
void write_file(unsigned char* r_data, unsigned char *g_data, unsigned char*
b_data, char filename[])
{
FILE *fd;
fd = fopen(filename, "wb");
static char data2[width*height*3];
for (int i=0; i<width*height; i++)
{
data2[i] = r_data[i];
data2[i+width*height] = g_data[i];
data2[i+width*height*2] = b_data[i];
}
fwrite(data2, sizeof(data2) ,sizeof(unsigned char), fd);
fclose(fd);
}
void HSI_RGB(unsigned char* r_data, unsigned char *g_data, unsigned char*
b_data, double* R, double* G, double* B, double* H, double* S, double* I,
char filename[])
{
static double h[width*height];
static double s[width*height];
static double i[width*height];
for (int j=0;j <width*height; j++)
{
h[j] = H[ j ]*pi/180.0;
s[j] = S[j]/100.0;
i[j] = I[j]/255.0;
if (j==0)
if (h[j] < 2*pi/3.0)
{
B[j] = i[j]*(1-s[j]);
R[j] = i[j]*(1+ (s[j]*cos(h[j])/cos(pi/3.0 - h[j])));
G[j] = 3*i[j] - (i[j]*(1-s[j])) - (i[j]*(1+ (s[j]*cos(h[j])/cos(pi/3.0 -
h[j]))));
}
else if (2*pi/3.0 <= h[j] && 4*pi/3.0 > h[j])
{
h[j] = h[j] - 2*pi/3.0;
R[j] = i[j]*(1-s[j]);
G[j] = i[j]*(1+ (s[j]*cos(h[j])/cos(pi/3.0 - h[j])));
B[j] = 3*i[j] - (i[j]*(1-s[j])) - (i[j]*(1+ (s[j]*cos(h[j])/cos(pi/3.0 -
h[j]))));
}
else if (4*pi/3.0 <= h[j] && 2*pi > h[j])
{
h[j] = h[j] - 4*pi/3.0;
G[j] = i[j]*(1-s[j]);
B[j] = i[j]*(1+ (s[j]*cos(h[j])/cos(pi/3.0 - h[j])));
R[j] = 3*i[j] - (i[j]*(1-s[j])) - (i[j]*(1+ (s[j]*cos(h[j])/cos(pi/3.0 -
h[j]))));
}
G[j] = G[j]*255;
B[j] = B[j]*255;
R[j] = R[j]*255;
R[j] = (R[j] > 255) ? 255 : R[j];
G[j] = (G[j] > 255) ? 255 : G[j];
B[j] = (B[j] > 255) ? 255 : B[j];
r_data[j] = (unsigned char) R[j];
g_data[j] = (unsigned char) G[j];
b_data[j] = (unsigned char) B[j];
}
write_file(r_data, g_data, b_data, filename);
}
void RGB_HSI(unsigned char* r_data, unsigned char *g_data, unsigned char*
b_data)
{
static double R[width*height];
static double G[width*height];
static double B[width*height];
static double theta[width*height];
static double H[width*height];
static double S[width*height];
static double I[width*height];
for (int i=0; i< width*height; i++)
{
R[i] = (double) r_data[i]/((double)r_data[i] + (double)g_data[i] +
(double)b_data[i]);
G[i] = (double) g_data[i]/((double)r_data[i] + (double)g_data[i] +
(double)b_data[i]);
B[i] = (double) b_data[i]/((double)r_data[i] + (double)g_data[i] +
(double)b_data[i]);
double a1 = 0.5*((R[i] - G[i]) + (R[i] - B[i]));
double a2 = pow(pow(R[i] - G[i],2.0) + (R[i] - B[i])*(G[i] - B[i]),0.5);
double min = (R[i] > G[i]) ? G[i]:R[i];
min = (min > B[i]) ? B[i]:min;
//----------H
if (B[i] > G[i])
H[i] = 2*pi - acos(a1/a2);
else
H[i] = acos(a1/a2);
//----------S
S[i] = 1-3*min;
//----------I
I[i] = ((double) r_data[i]+(double) g_data[i]+(double)
b_data[i])/(3.0*255.0);
H[i] = H[i]*180/pi;
S[i] = S[i]*100;
I[i] = I[i]*255;
}
HSI_RGB(r_data, g_data, b_data, R, G, B, H, S, I, "lena_t.raw");
}
int main()
{
unsigned char r_data[width*height];
unsigned char g_data[width*height];
unsigned char b_data[width*height];
read_file(r_data, g_data, b_data);
RGB_HSI(r_data, g_data, b_data);
return 0;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.25.118.153
※ 編輯: tracy23 來自: 163.25.118.153 (11/22 01:35)
※ 編輯: tracy23 來自: 163.25.118.153 (11/22 03:04)
推
11/22 08:13, , 1F
11/22 08:13, 1F
推
11/22 15:04, , 2F
11/22 15:04, 2F
→
11/22 15:04, , 3F
11/22 15:04, 3F
→
11/22 15:32, , 4F
11/22 15:32, 4F
→
11/22 15:36, , 5F
11/22 15:36, 5F
→
11/22 15:50, , 6F
11/22 15:50, 6F
推
11/22 15:58, , 7F
11/22 15:58, 7F
→
11/22 15:59, , 8F
11/22 15:59, 8F
→
11/22 17:06, , 9F
11/22 17:06, 9F
推
11/22 17:16, , 10F
11/22 17:16, 10F
k大說對了!!
剛剛發現 寫了一堆測試的東西卻沒刪乾淨 造成這種結果 真是.... Orz
謝謝上面的每一個人!! 第一次在這裡問問題不清楚 以後知道囉
跑出來的時候超感動~ 太感謝大家了!!! 謝謝~
※ 編輯: tracy23 來自: 163.25.118.153 (11/22 17:43)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章