python +opencv 自动消除红眼

红眼形成?

由于相机曝光,进光量太大造成,红眼毫无疑问红色通道的值要大于绿色和蓝色,那么就要想办法用绿色和蓝色组合

如何消除红眼?

1、眼睛检测--利用opencv 自带的xml,笔者以前的博客很多这种

2、构造mask

mask=r>150&r>(b+g)笔者在加上r>150的时候,有问题,所以只保留了如r>(b+g)这个

3、对于mask 进行填洞,因为得到mask可能存在空缺

4、这一步就是如何替换红眼了,有两种方法:

1)用绿色和蓝色的均值替换红色通道

2)用绿色和蓝色的均值替换所有通道

方法1效果图如下:

可以看见眼珠子是紫色

方法2 效果图如下:

眼珠子正常,所以要用蓝色和绿色的均值替换所有通道

代码如下:

import numpy as np
import cv2
class red_eye_elimate(object):
    def __init__(self,file_path):
        self.file_path=file_path
    @staticmethod
    def fillhole(thresh):
        h,w=thresh.shape[:]
        mask=np.zeros((h+2,w+2),np.uint8)
        holes=cv2.floodFill(thresh.copy(),mask,(0,0),255)
        s=cv2.bitwise_not(holes[1])
        full_thresh=s|thresh
        return full_thresh
    def detect_eye_and_elimate(self):
        eye=cv2.CascadeClassifier('haarcascade_eye.xml')
        eye.load(r'E:\opencv\opencv\sources\data\haarcascades\haarcascade_eye.xml')
        image=cv2.imread(self.file_path)
        eyes=eye.detectMultiScale(image,1.03,20,0,(40,40))
        if len(eyes)!=0:
            for x,y,w,h in eyes:
                eye_image_bgr=image[y:y+h,x:x+w]
                r=eye_image_bgr[:,:,2]
                b=eye_image_bgr[:,:,0]
                g=eye_image_bgr[:,:,1]
                mask=r>(cv2.add(b,g))
                mask = mask.astype(np.uint8)*255
                full_mask=self.fillhole(np.uint8(mask*255))
                mean=cv2.add(b,g)/2
                mean=mean.astype(np.uint8)
                eye_copy=eye_image_bgr.copy()
                np.copyto(eye_copy,mean[:,:,np.newaxis],where=full_mask.astype(np.bool)[:,:,np.newaxis])
                image[y:y+h,x:x+w]=eye_copy
        return image
if __name__=="__main__":
    file_path=r"C:\Users\Y\Desktop\red\1.png"
    red=red_eye_elimate(file_path)
    image=red.detect_eye_and_elimate()
    cv2.imshow("sa",image),cv2.waitKey(0)                        

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值