我正在使用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返回了包括周围区域在内的眼部区域。如何跟踪眼球,这将解决这个问题。
答案 0 :(得分:3)
快速浏览一下TrackingJS,可以看出它没有提供带红色边界的“眼睛区域”并将其细化为虹膜。
因此,您必须找到提供此优化的跟踪应用程序或自行编写细化代码。
在Stackoverflow中推荐虹膜跟踪库是偏离主题的,并且执行虹膜跟踪的代码答案过于宽泛,无法作为良好的Stackoverflow答案。
话虽如此,这里有 verrrrrry 找到虹膜的大纲:
从TrackingJS检测到的“眼睛区域”开始,
通过对该眼部区域中最白的像素进行颜色测试来获取巩膜的边界框,
在此边界框中,通过颜色测试获得2个巩膜区域之间最暗像素的圆形瞳孔区域。
以圆形瞳孔为基础,通过向外扩展瞳孔圆的半径直至到达白色巩膜来找到虹膜。
[其他想法]
我继续思考需要处理的许多非标准情况:
眼睑闭合或眯眼,
虹膜完全左或右,没有白色边界包裹光圈,
由于出现黄疸或血丝,巩膜的颜色不够明显,
眼部化妆品可能比sclara更白,
镜头眩光和反射等照片缺陷
而且我没想到更多!
如果您的项目允许,如果用户点击2个瞳孔并扩展瞳孔半径以定义虹膜,则会更容易。学生可能比其他眼睛结构更暗,并且将是圆形的(但可能被眼睑夹住)。
如果您的项目无法允许用户选择瞳孔,您可以使用“边缘检测”算法来隔离瞳孔(可能是Sobel边缘检测)。