在最近的項目中,我必須操作圖像,但由於這對我來說是新的,所以我迷失了方向。如何更改黑色的白色背景
我需要使用常規掃描設備掃描手。我可以做到這一點,但背景是白色的,我需要它是黑色的。經過幾天的研究找到改變顏色的方式,我只有一個圖像,似乎在ms paint中剪切和粘貼。
原始圖像:
測試:
我需要的是這樣的:
我嘗試使用Marvin Framework,Imagej,Catalano框架。要查看我需要的設置,我使用gimp,marving編輯器,斐濟應用程序(但沒有得到我期待的結果)。
我想我需要的是轉換爲灰度,應用某種閾值,但在一定範圍內的顏色使用alpha顏色(但我沒有找到方法,只有閾值的二進制圖像),然後應用掩碼插入使用閾值灰度圖像的原始圖像中,但我不知道如何在Java中直接執行此操作,或者使用上面提到的任何框架。
任何幫助,將不勝感激。
UPDATE 根據m69的說法,我試着打出明亮的價值,從rgb轉換爲hsl。我只設置較暗的顏色。
先用的光的0.5的閾值嘗試:
第二嘗試用的光
float threshold = 0.5f;
for(int y=0; y<imageIn.getHeight(); y++){
for(int x=0; x<imageIn.getWidth(); x++){
int r = imageOut.getIntComponent0(x, y);
int g = imageOut.getIntComponent1(x, y);
int b = imageOut.getIntComponent2(x, y);
float[] hsl = HSLColor.fromRGB(r, g, b, null);
if(hsl[2] >= threshold){
float t = (hsl[2]-0.5f)*2f;
hsl[2] -= t;
imageOut.setIntColor(x, y, HSLColor.toRGB(hsl));
}
}
}
問題0.9 AA閾值是這種方法改變所有像素的光線,理想的是隻改變物體外部的顏色。我在網上尋找一個想法,並且我發現了MartinJaník提出的用於骨科分析的論文。他建議接下來的算法:
- 應用高斯濾波掃描得到過濾後的圖像腳
- 門檻過濾圖像得到二值圖像
- 形態接近二進制圖像以獲得封閉的二進制圖像
- 對二進制圖像應用高斯濾波以獲得灰度蒙版
- 將該蒙版應用於腳掃描以獲得總體腳形圖像
而與此我可以得到一個結果:
這是接近我想要的東西,因爲在物體顏色不感動。但是物體周圍的白色邊框仍然是一個問題。這是因爲我使用combineByMask marving插件,它只是支持二進制圖像(不只是二進制圖像,但只能掩蓋一種顏色)。我認爲需要一個新的插件來結合使用灰度圖像蒙板,當顏色在1-255的範圍內嘗試與圖像底色結合以獲得更暗或更淡的顏色(當顏色爲255時,應該離開只是基本圖像的顏色)。
這就是我所說的掩蔽灰度圖像的示例圖像:
我想這就是我要採取的路徑。
更新2
做一些研究之後,我覺得我很接近我想要的結果。我所使用的算法是:
- 應用5個
- 轉換的對比度爲灰度圖像
- 應用高斯濾波器
- 閾值的圖像
- 形態接近
- Applay高斯濾波器再次
- 將此結果圖像用作原始灰度蒙版
這是結果圖像:
這是接近我想要的。在這六步中,我可以應用兩次,三次或更多次的高斯濾鏡,給出更加柔和的邊界效果,但最後總是顯示一個薄的白色邊框,因爲掃描圖像的性質(我認爲這是我可以不處理),但我很滿意這個結果。現在,因爲我沒有找到一個java算法應用於灰度蒙版,我的代碼如下:
for(int y=0; y<mask.getHeight(); y++){
for(int x=0; x<mask.getWidth(); x++){
//ya que está en grayscale, los 3 valores son los mismos
int r1 = mask.getIntComponent0(x, y);
int g1 = mask.getIntComponent1(x, y);
int b1 = mask.getIntComponent2(x, y);
int r2 = image.getIntComponent0(x, y);
int g2 = image.getIntComponent1(x, y);
int b2 = image.getIntComponent2(x, y);
//al color de salida, le asignamos la luminicencia de la imagen mascara
int r = 0, g = 0, b = 0;
if(r1 > 0 || r2 > 0){
r = r1*r2/Math.max(r1, r2);
}
if(g1 > 0 || g2 > 0){
g = g1*g2/Math.max(g1, g2);
}
if(b1 > 0 || b2 > 0){
b = b1*b2/Math.max(b1, b2);
}
image.setIntColor(x, y, r, g, b);
}
}
擁有近得非常好,但有一點微小的細節,我解決不了。我們的想法是在辮形我沒有圖像混合以下:具有一個上層的灰度掩模,施加顏色的α函數的白顏色,得到這樣的結果:
隨着算法我寫了marving框架,我得到的下一張圖片:
不同的是,我的算法不能低時,有一個更白的顏色原始圖像的亮度的顏色,你可以看到,效果比較2張圖片。任何想法如何處理它?這是在GIMP應用層組合後的圖像結果:
我認爲白色邊框來自於在曲線的閾值處使用方向的突然變化,而不是像我在示例中那樣的圓角彎曲。檢查你的框架是否有任何方法來爲亮度創建樣條曲線,或者使用圓的一部分或某些東西來展開自己的樣式。 – m69
如果你還在研究這個項目,並且想進一步討論,你可以在ImageJ論壇上發佈:http://forum.imagej.net/。有相當多的圖像處理專家可能會對你的分析提供建議和努力。 – ctrueden