[問題] HSI RGB轉換

看板C_and_CPP (C/C++)作者 (tracy)時間15年前 (2010/11/22 01:28), 編輯推噓4(406)
留言10則, 3人參與, 最新討論串1/1
將圖從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
麻煩這種量的code用置底網站貼一下, 順便附一下測資, 不
11/22 15:04, 2F

11/22 15:04, , 3F
然就算有網友有心想看, 光cp這些code就覺得煩了說:)
11/22 15:04, 3F

11/22 15:32, , 4F
11/22 15:32, 4F

11/22 15:36, , 5F
我發現..他的括號對應有問題.自動縮排後對不起來..XD
11/22 15:36, 5F

11/22 15:50, , 6F
原po先把所有的char 換成 unsigned char 試試
11/22 15:50, 6F

11/22 15:58, , 7F
t大幫補的code好像有缺漏說Orz 不過的確推t大所言, 先把
11/22 15:58, 7F

11/22 15:59, , 8F
char都改用unsigned char試試先....:)
11/22 15:59, 8F

11/22 17:06, , 9F
RGB_HSI 裡的theta似乎沒有用到...
11/22 17:06, 9F

11/22 17:16, , 10F
HSI_RGB 裡 , if (j==0) 這裡...
11/22 17:16, 10F
k大說對了!! 剛剛發現 寫了一堆測試的東西卻沒刪乾淨 造成這種結果 真是.... Orz 謝謝上面的每一個人!! 第一次在這裡問問題不清楚 以後知道囉 跑出來的時候超感動~ 太感謝大家了!!! 謝謝~ ※ 編輯: tracy23 來自: 163.25.118.153 (11/22 17:43)
文章代碼(AID): #1CwLQW7R (C_and_CPP)
文章代碼(AID): #1CwLQW7R (C_and_CPP)