Color Transfer Between Image
Color Transfer Between Image
Color Transfer Between Images算法中,給定兩張圖片source_img和target_img。該算法可以把source_img中的顏色遷移到target_img中。
算法主要思路為:
- 給定輸入圖像source_img和target_img
- 把source_img和target_img轉換到Lab顏色空間,轉換后圖像為source_lab和target_lab
- 分別計算source_Lab和target_lab三個通道的均值和標準差
- 根據論文中的公式,分別計算三通道的變換值:
5. 把Lab空間的結果圖像再轉換到RGB空間,并顯示
Lab轉RGB空間和RGB轉LAB空間,可以參考之前寫的博文:RGB與Lab顏色空間互相轉換
算法關鍵代碼實現:
RGB2Lab(source_img,source_lab);
RGB2Lab(target_img,target_lab);
source_Mean = ConputerMean(source_lab,source_height,source_width,source_line_byte);
target_Mean = ConputerMean(target_lab,target_height,target_width,target_line_byte);
source_Labvar = ConputerVar(source_height,source_width,source_Mean);
target_Labvar = ConputerVar(target_height,target_width,target_Mean);
Color_Transform_Func(target_lab,source_Labvar,target_Labvar,source_Mean,target_Mean,target_height,target_width,target_line_byte);
bmp = Lab2RGB(target_img,target_lab);
fwrite(bmp, target_line_byte*target_height, 1, Color_Transform_BMP_fp);
fclose(Color_Transform_BMP_fp);
free(Color_Transform_BMP);
free(bmp);
return 0;
計算均值和方差關鍵代碼:
LABMEAN ConputerMean(float *lab_img,DWORD height,DWORD width,T_U32 line_byte)
{
double LMean,aMean,bMean,SumL,SumA,SumB,SumL2,SumA2,SumB2,TmpL,TmpA,TmpB,size,l,a,b;
DWORD i,j,index;
LABMEAN labMean = {0};
LMean = 0.0;
aMean =0;
bMean=0.0;
SumL = 0;
SumA = 0;
SumB = 0;
SumL2 = 0.0;
SumA2 = 0.0;
SumB2 = 0.0;
TmpL = 0;
TmpA = 0.0;
TmpB = 0;
size = width*height;
for(i = 0; i < height;i++)
{
for(j = 0;j < width;j++)
{
index = i*line_byte+3*j;
TmpL = lab_img[index+0];
SumL += TmpL;
SumL2 += TmpL*TmpL;
TmpA = lab_img[index+1];
SumA += TmpA;
SumA2 += TmpA*TmpA;
TmpB = lab_img[index+2];
SumB += TmpB;
SumB2 += TmpB*TmpB;
}
}
LMean = SumL/(size);
aMean = SumA/(size);
bMean = SumB/(size);
labMean.MeanL = LMean;
labMean.MeanA = aMean;
labMean.MeanB = bMean;
labMean.SumL = SumL;
labMean.SumA = SumA;
labMean.SumB = SumB;
labMean.SumL2 = SumL2;
labMean.SumA2 = SumA2;
labMean.SumB2 = SumB2;
return labMean;
}
LABVAR ConputerVar(DWORD height,DWORD width,LABMEAN labMean)
{
double LVar,aVar,bVar,size;
LABVAR labvar = {0};
LVar = 0.0;
aVar = 0.;
bVar = 0.0;
size = width*height;
LVar = (labMean.SumL2-(labMean.SumL*labMean.SumL)/size)/size;
aVar = (labMean.SumA2-(labMean.SumA*labMean.SumA)/size)/size;
bVar = (labMean.SumB2-(labMean.SumB*labMean.SumB)/size)/size;
LVar = sqrt(LVar);
aVar = sqrt(aVar);
bVar = sqrt(bVar);
labvar.VarL = LVar;
labvar.VarA = aVar;
labvar.VarB = bVar;
return labvar;
}
顏色轉換關鍵代碼實現:
void Color_Transform_Func(float *lab_img,LABVAR source_var,LABVAR target_var,LABMEAN source_mean,LABMEAN target_mean,DWORD height,DWORD width,T_U32 line_byte)
{
int i,j,index;
for(i = 0; i < height;i++)
{
for(j = 0;j < width;j++)
{
index = i*line_byte+3*j;
lab_img[index+0] -= target_mean.MeanL;
lab_img[index+1] -= target_mean.MeanA;
lab_img[index+2] -= target_mean.MeanB;
lab_img[index+0] = (target_var.VarL/source_var.VarL)*lab_img[index+0];
lab_img[index+1] = (target_var.VarA/source_var.VarA)*lab_img[index+1];
lab_img[index+2] = (target_var.VarB/source_var.VarB)*lab_img[index+2];
lab_img[index+0] += source_mean.MeanL;
lab_img[index+1] += source_mean.MeanA;
lab_img[index+2] += source_mean.MeanB;
}
}
}
圖像結果:
左圖為source_img,又圖為target_img
結果圖像
智能推薦
數字圖像處理實驗(16):PROJECT 06-03,Color Image Enhancement by Histogram Processing ...
實驗要求: Objective: To know how to implement image enhancement for color images by histogram processing. Note that the definition of histogram for color images differs from that of histogram for gray ima...
C++ opencv Image visual enhancement - false color(圖像視覺效果增強-偽彩色)
今天,抽短暫時間實現了一個新的功能,那就是16位圖像的讀取以及偽彩色視覺效果增強。個人感覺各種語言還是C++好用,PY雖然很火,但是項目中執行效率是真的難受。 --->Today, a new feature has been briefly implemented, which is the ability to read 16-bit images and enhance false-c...
background-color和background-image一起用時需注意
不知道大家有沒有遇到過background-color和background-image一起使用的情況,那有沒有小伙伴遇到給了背景顏色,但是使用背景圖片的時候,背景顏色會變透明,模擬代碼如下(html里只有一個div): 在只有背景顏色時,盒子呈現:當我們加入背景圖片時,盒子呈現出背景色為透明,只有背景圖片的形式: 而大家也許在想有可能是因為加入的背景圖片是png格式的關系,所以背景顏色才會出現透...
數字圖像處理實驗(17):PROJECT 06-04,Color Image Segmentation
實驗報告: Objective: Color image segmentation is a big issue in image processing. This students need to know the basics of this topic. Main requirements: Ability of programming with C, C++, or Matlab. Ins...
數字圖像處理實驗(15):PROJECT 06-02,Pseudo-Color Image Processing
實驗要求: 上面的實驗要求中Objective(實驗目的)部分是錯誤的。 然而在我拿到的大綱中就是這么寫的,所以請忽視那部分,其余部分是沒有問題的。 本實驗是使用偽彩色強調突出我們感興趣的灰度范圍,在實驗要求中制定了一些強調的對象。在程序中我們遍歷所有的像素,判斷其灰度級,如果在我們感興趣的那一特定范圍內,就使用彩色顯示出來,即偽彩色圖像處理。 實驗代碼: 實驗結果: 原圖像: 偽彩色處理后的圖像...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...