紅眼消除算法
回答
我對這裏的派對遲到了,但對於未來的搜索者,我使用了以下算法來編寫我寫的個人應用程序。
首先,要縮小的區域由用戶選擇,並作爲中心點和半徑傳遞給紅眼減少方法。該方法循環通過該半徑範圍內的每個像素,並執行以下計算:
//Value of red divided by average of blue and green:
Pixel pixel = image.getPixel(x,y);
float redIntensity = ((float)pixel.R/((pixel.G + pixel.B)/2));
if (redIntensity > 1.5f) // 1.5 because it gives the best results
{
// reduce red to the average of blue and green
bm.SetPixel(i, j, Color.FromArgb((pixel.G + pixel.B)/2, pixel.G, pixel.B));
}
我很喜歡的這個結果,因爲它們保持顏色強度,這意味着眼睛的光反射不會降低。 (這意味着眼睛保持「活力」的樣子。)
最簡單的算法,仍然非常有效的一種方法是將感興趣區域的RGB三元素的R值歸零。
紅色消失,但其他顏色保留。
該算法的進一步擴展可能涉及將R值僅歸零,其中紅色是主色(R> G和R> B)。
如果沒有人提供更直接的答案,您可以隨時下載the source code for GIMP並查看他們是如何做到的。
您可以嘗試的ImageMagick - 此頁面上的一些技巧,如何做到這一點
http://www.cit.gu.edu.au/~anthony/info/graphics/imagemagick.hints
搜索紅眼頁面
首先你需要找到眼睛! 標準的方法是運行邊緣檢測器,然後進行Hough變換以找到兩個相同大小的圓,但是可能有更簡單的算法來簡單地查找紅色像素的簇。
然後,您需要決定如何替換它們,假設圖像中有足夠的綠色/藍色數據,您可以忽略紅色通道。
OpenCV是一個非常好的圖像處理免費庫,它可能是你想要的矯枉過正 - 但有很多的例子和一個非常活躍的社區。 您也可以搜索對象跟蹤算法,跟蹤場景中的彩色對象是一個非常相似和常見的問題。
這裏是java實現溶液
public void corrigirRedEye(int posStartX, int maxX, int posStartY, int maxY, BufferedImage image) {
for(int x = posStartX; x < maxX; x++) {
for(int y = posStartY; y < maxY; y++) {
int c = image.getRGB(x,y);
int red = (c & 0x00ff0000) >> 16;
int green = (c & 0x0000ff00) >> 8;
int blue = c & 0x000000ff;
float redIntensity = ((float)red/((green + blue)/2));
if (redIntensity > 2.2) {
Color newColor = new Color(90, green, blue);
image.setRGB(x, y, newColor.getRGB());
}
}
}
}
是由通過類似開放CV的應用程序檢測到的兩個矩形檢索到的參數(這應該是涉及眼睛位置的矩形)
int posStartY = (int) leftEye.getY();
int maxX = (int) (leftEye.getX() + leftEye.getWidth());
int maxY = (int) (leftEye.getY() + leftEye.getHeight());
this.corrigirRedEye(posStartX, maxX, posStartY, maxY, image);
// right eye
posStartX = (int) rightEye.getX();
posStartY = (int) rightEye.getY();
maxX = (int) (rightEye.getX() + rightEye.getWidth());
maxY = (int) (rightEye.getY() + rightEye.getHeight());
this.corrigirRedEye(posStartX, maxX, posStartY, maxY, image);
這是Benry提供的答案的更完整的實現:
using SD = System.Drawing;
public static SD.Image ReduceRedEye(SD.Image img, SD.Rectangle eyesRect)
{
if ( (eyesRect.Height > 0)
&& (eyesRect.Width > 0)) {
SD.Bitmap bmpImage = new SD.Bitmap(img);
for (int x=eyesRect.X;x<(eyesRect.X+eyesRect.Width);x++) {
for (int y=eyesRect.Y;y<(eyesRect.Y+eyesRect.Height);y++) {
//Value of red divided by average of blue and green:
SD.Color pixel = bmpImage.GetPixel(x,y);
float redIntensity = ((float)pixel.R/((pixel.G + pixel.B)/2));
if (redIntensity > 2.2f)
{
// reduce red to the average of blue and green
bmpImage.SetPixel(x, y, SD.Color.FromArgb((pixel.G + pixel.B)/2, pixel.G, pixel.B));
pixel = bmpImage.GetPixel(x,y); // for debug
}
}
}
return (SD.Image)(bmpImage);
}
return null;
}
閱讀這個博客,關於檢測和糾正紅眼有一個很好的解釋。 Red eye correction with OpenCV and python
- 1. WinRT紅眼消除
- 2. 紅眼消除android
- 3. 消除紅眼破壞性按鈕可以從ActionSheet
- 4. 紅眼檢測
- 5. 紅眼校正
- 6. 紅眼與視覺
- 7. 紅黑樹的刪除算法
- 8. 紅寶石算法
- 9. 如何從iPhone中的圖像中刪除紅眼?
- 10. 排列,偶算法和反向消除
- 11. 遞歸高斯消除算法
- 12. 雙重消除比賽算法forbes%4
- 13. 虹膜檢測或紅眼檢測
- 14. 紅眼vs MS代碼覆蓋工具
- 15. 調試紅寶石算法
- 16. 紅寶石計算方法
- 17. 鳥舍sdk - 紅眼功能無法正常工作
- 18. 眼下計算在Python
- 19. 用於從紅黑樹中刪除多個元素的算法
- 20. 紅黑樹刪除算法(CLR第3版)
- 21. 紅寶石三分法算法
- 22. 消除遞歸刪除空目錄算法
- 23. 字消歧算法(Lesk算法)
- 24. Java方法撤消算法
- 25. 撤消紅移
- 26. 紅寶石無法識別 「^ =」 運算符
- 27. 紅寶石1.8黃金SUCC算法
- 28. 紅寶石算法的產品
- 29. 紅寶石機器學習算法
- 30. 紅黑樹的迭代算法
您也可以在點擊點使用用戶提供的最大半徑的「魔棒」選擇工具。 – rafaelcastrocouto 2017-02-19 13:19:54