3

我正在使用 html5 画布处理红眼去除效果。我使用 tracking.js 来跟踪眼睛。检查以下代码。

html

<!-- Include tracking js libraries -->
<script src="js/tracking-min.js"></script>
<script src="js/eye-min.js"></script>

<img id="sourceImg" src="red_eye1.jpg"  width="202" height="187">
<canvas id="myCanvas" width="202" height="187" style="border:1px solid #d3d3d3;"></canvas>

Javascript

document.getElementById("sourceImg").onload = function() {
    var c = document.getElementById("myCanvas");
    var ctx = c.getContext("2d");
    var img = document.getElementById("sourceImg");
    ctx.drawImage(img, 0, 0);

    // track eyes
    var tracker = new tracking.ObjectTracker(['eye']);
    tracker.setStepSize(1.7);
    tracking.track('#sourceImg', tracker);
    tracker.on('track', function(event) {
        event.data.forEach(function(rect) {
            // rect consists area of each eyes.
            var imgData = ctx.getImageData(rect.x, rect.y, rect.width, rect.height);
            // remove red eye
            var i;
            for (i = 0; i < imgData.data.length; i += 4) {
                // find and check red intensity
                var redIntensity = (imgData.data[i] / ((imgData.data[i+1] + imgData.data[i+2]) / 2));
                if (redIntensity > 1.5)  // 1.5 because it gives the best results
                {
                    // reduce red to the average of blue and green
                    imgData.data[i] = (imgData.data[i+1] + imgData.data[i+2]) / 2;
                }
            }
            ctx.putImageData(imgData, rect.x, rect.y);

        });
    });  
};

我得到了以下结果。 在此处输入图像描述

此处红眼成功消除。但它影响了眼睛周围的颜色。因为 tracking.js 返回的眼睛区域包括周围区域。如何跟踪眼球,这将解决这个问题。

4

1 回答 1

3

快速浏览一下 TrackingJS 会发现,它并没有提供带红色边框的“眼睛区域”并将其细化为仅虹膜。

因此,您必须找到一个提供此改进的跟踪应用程序或自己编写改进代码。

推荐虹膜跟踪库在 Stackoverflow 中是题外话,并且执行虹膜跟踪的代码答案太宽泛,无法作为一个好的 Stackoverflow 答案。

话虽如此,这里有一个寻找虹膜的粗略大纲

  • 从 TrackingJS 检测到的“眼睛区域”开始,

  • 通过对该眼睛区域中最白像素的颜色测试来获取巩膜的边界框,

  • 在这个边界框中,通过对 2 个巩膜区域之间的最暗像素进行颜色测试来获得圆形瞳孔区域。

  • 以圆形瞳孔为基础,通过向外扩大瞳孔圆的半径直到到达白色巩膜来找到​​虹膜。

[补充想法]

我继续思考许多需要处理的非标准情况:

  • 眼睑闭合或眯眼,

  • 虹膜完全向左或向右,没有包裹虹膜的白色边界,

  • 由于黄疸或充血,巩膜颜色不够清晰,

  • 可能比 sclara 更白的眼部化妆品,

  • 镜头光晕和反射等照片缺陷,

  • 还有更多我没有想到的!

如果您的项目允许,如果用户单击 2 个瞳孔并扩大瞳孔半径以定义虹膜,会容易得多。瞳孔可能比其他眼睛结构更暗,并且是圆形的(但可能被眼睑夹住)。

如果您的项目不允许用户选择瞳孔,您可以使用“边缘检测”算法来隔离瞳孔(可能是 Sobel 边缘检测)。

于 2015-03-10T08:03:26.530 回答