祛除红眼算法python实现

news2024/12/28 6:04:19

最近研究了一下祛除红眼的算法,主要的思想都是将RGB通道里面的R通道给想法设法的降低,其他的通道稍微进行变换就行,这里使用python运行了一下例子看看,

version2参考了代码:https://www.cnblogs.com/cpuimage/p/9000203.html

使用python进行了重新复现,这个算法的效果很不错,比起遍地都是的方法(version1)会好一些,version1方法会明显祛除不干净的,初步猜测是version1方法里面使用的简单粗暴的mask,这个mask应该不够准确和平滑,会导致后续的效果精度不足。


import math
import cv2
import numpy as np

def fillHoles(mask):
    maskFloodfill = mask.copy()
    h, w = maskFloodfill.shape[:2]
    maskTemp = np.zeros((h+2, w+2), np.uint8)    
    cv2.floodFill(maskFloodfill, maskTemp, (0, 0), 255)
    mask2 = cv2.bitwise_not(maskFloodfill)
    
    return mask2 | mask


def remove_red_eyes_version1(img):
    imgOut = img.copy()
    eyesCascade = cv2.CascadeClassifier("haarcascade_eye.xml")
    eyes = eyesCascade.detectMultiScale(img, scaleFactor=1.3)
    for (x, y, w, h) in eyes:
        eye = img[y:y+h, x:x+w]
        b = eye[:, :, 0]
        g = eye[:, :, 1]
        r = eye[:, :, 2]
        bg = cv2.add(b, g)
        mask = (r > 150) &  (r > bg)
        mask = mask.astype(np.uint8)
        mask = fillHoles(mask)
        mask = cv2.dilate(mask, None, anchor=(-1, -1), iterations=3)
                
        mean = bg / 2
        mask = mask.astype(np.bool)[:, :, np.newaxis]
        mean = mean[:, :, np.newaxis]
        eyeOut = eye.copy()
        eyeOut = np.where(mask, mean, eyeOut)
        imgOut[y:y+h, x:x+w, :] = eyeOut
    return imgOut
    
    
def remove_red_eyes_version2(img_input, radius):
    img_out = img_input.copy()
    height, width = img_input.shape[:2]
    eyesCascade = cv2.CascadeClassifier("haarcascade_eye.xml")
    eyes = eyesCascade.detectMultiScale(img_input, scaleFactor=1.3)
    img_input=img_input.astype(float)
    for (x, y, w, h) in eyes:
        center_x=x+w//2
        center_y=y+h//2
        '''
        #因为这个眼睛检测算法精度不是很好,很可能存在误检测的情况,
        这里只能先简单过滤一下,可以选择更好的眼睛检测算法
        '''
        if w*h<100*100:
            continue
    
        left = np.clip(int(center_x - radius), 0, width)
        top = np.clip(int(center_y - radius), 0, height)
        right = np.clip(int(center_x + radius), 0, width)
        bottom = np.clip(int(center_y + radius), 0, height)
        pow_radius = radius * radius
        for y in range(top, bottom):
            offset_y = y - center_y
            for x in range(left, right):
                offset_x = x - center_x
                dis = offset_x*offset_x+offset_y*offset_y
                if dis <= pow_radius:
                    red = img_input[y, x, 2]
                    green = img_input[y, x, 1]
                    blue = img_input[y, x, 0]
                    nrv = blue+green
                    if nrv < 1:
                        nrv = 1
                    if green > 1:
                        bluf = blue/green
                    else:
                        bluf = blue
                    bluf = max(0.5, min(1.5, math.sqrt(bluf)))#获取一个数值为0.5到1.5之间的数值
                    redq = red/(nrv*bluf)
                    if redq > 0.7:
                        powr = 1.775-(redq*0.75+0.25)#可以看到如果redq越大,powr就越小,也就是说如果红色分量越大,powr就越小
                        if powr < 0:
                            powr = 0
                        powr = powr*powr
                        powb = 0.5+0.5*powr#因为powr大于0,所以powb大于0.5
                        powg = 0.75+0.25*powr#因为powr大于0,所以powg大于0.75
                        img_out[y, x, 2] = powr*red+0.5
                        img_out[y, x, 1] = powg*green+0.5
                        img_out[y, x, 0] = powb*blue+0.5
                    
    return img_out
    

if __name__ == '__main__' :

    img = cv2.imread("34.jpg", cv2.IMREAD_COLOR)
    imgOut = remove_red_eyes_version1(img)
    imgOut2=remove_red_eyes_version2(img, 20)
    cv2.imwrite('imgOut.jpg',imgOut)
    cv2.imwrite('imgOut2.jpg',imgOut2)
    

效果图:

 我再放大一些可能会更加明显

我们可以清楚的看到,version2效果会平滑很多,没有明显的瑕疵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为IP-san实验搭建

文章目录 RedHat or CentOS系统1、获得多路径软件2、配置主机iscsi名3、配置存储映射4、主机访问存储的LUN5、安装多路径解决重复磁盘问题6、使用多路径扫盘 windows系统1、为win虚拟机提供多路径包文件2、创建存储与主机的连接3、主机使用磁盘 RedHat or CentOS系统 1、获得多…

为什么 kubernetes 环境要求开启 bridge-nf-call-iptables ?

文章目录 背景基于网桥的容器网络Service 同节点通信问题开启 bridge-nf-call-iptables我的环境netshoot 工具 参考 背景 Kubernetes 环境中&#xff0c;很多时候都要求节点内核参数开启 bridge-nf-call-iptables: sysctl -w net.bridge.bridge-nf-call-iptables1 参考官方文…

SQL语句的一些高级用法1

这里写目录标题 SQL语句的一些高级用法11.修改表名和表结构1&#xff0e;修改表名 2.扩展表结构&#xff08;增加字段&#xff09;3.修改字段&#xff08;列&#xff09;名&#xff0c;添加唯一键4&#xff0e;删除字段 案例扩展数据表高级操作1.克隆表&#xff0c;将数据表的数…

【Spring Boot学习】Spring Boot的创建和使用

前言&#xff1a; &#x1f49e;&#x1f49e;今天我们开始学习Spring Boot&#xff0c;这里我们会学习到怎么去创建和使用Spring Boot&#xff0c;在这里我们会了解到什么是最为核心的框架之一。 &#x1f49e;&#x1f49e;前路漫漫&#xff0c;希望大家坚持下去&#xff0c;…

大模型 Transformer介绍-Part1

众所周知&#xff0c;transformer 架构是自然语言处理 (NLP) 领域的一项突破。它克服了 seq-to-seq 模型&#xff08;如 RNN 等&#xff09;无法捕获文本中的长期依赖性的局限性。事实证明&#xff0c;transformer 架构是 BERT、GPT 和 T5 及其变体等革命性架构的基石。正如许多…

SpringBoot仿GPT数据流传输

目录 Java数据流传输响应前提Springboot文字流响应Web端接收流数据并显示 SpingBoot集成ChatGPT使用流响应结果 Java数据流传输响应 前提 在折腾ChatGpt集成在SpringBoot项目时&#xff0c;发现了ChatGpt api返回数据时有两种返回方式&#xff0c;一种是使用流传输&#xff0…

MyCat总结

目录 什么是mycat 核心概念 逻辑库 逻辑表 分片节点 数据库主机 用户 mycat原理 目录结构 配置文件 读写分离 搭建读写分离 搭建主从复制&#xff1a; 搭建读写分离&#xff1a; 分片技术 垂直拆分 实现分库&#xff1a; 水平拆分 实现分库&#xff1a; ER表 全局表 分…

简要介绍 | 基于深度学习的姿态估计技术

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于深度学习的姿态估计技术进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 基于深度学习的姿态估计技术 背景介绍 …

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 告警抑制

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&a…

基于Dlib的疲劳检测系统

需要源码的朋友可以私信我 基于Dlib的疲劳检测系统 1、设计背景及要求2、系统分析3、系统设计3.1功能结构图3.2基于EAR、MAR和HPE算法的疲劳检测3.2.1基于EAR算法的眨眼检测3.2.2基于MAR算法的哈欠检测3.3.3基于HPE算法的点头检测 4、系统实现与调试4.1初步实现4.2具体实现过程…

使用MATLAB画SCI论文图

从gcf和gca说起 不论是 Python 绘图还是Matlab绘图&#xff0c;想要获得更好看的图&#xff0c;都会用到这两个单词。 gcf&#xff1a;get current figure&#xff0c;是目标图像的图形句柄对象 gca&#xff1a;get current axes&#xff0c;是目标图像的坐标轴句柄对象 Mat…

pandas---数学函数、离散化处理、分组聚合

1. 数学函数 方差&#xff1a;当数据分布比较分散&#xff08;即数据在平均数附近波动较大&#xff09;时&#xff0c;各个数据与平均数的差的平方和 较大&#xff0c;方差就较大&#xff1b;当数据分布比较集中时&#xff0c;各个数据与平均数的差的平方和较小。因此方差越 …

【计算机网络】如何学好计网-第一章概论

相关术语 URI&#xff1a;Uniform Resource Identifier 统一资源标识符&#xff0c;指的是一个资源 URL&#xff1a;Uniform Resource Location 统一资源定位符&#xff0c;URI的子集&#xff0c;用地址定为的方式指定一个资源 URN&#xff1a;Uniform Resource Name 统一资…

北京论道|光环云李卓然:以“云”为帆 赋能文化出海行业创新增长

2023年6月15~16日&#xff0c;由流媒体网主办&#xff0c;北京新媒体&#xff08;集团&#xff09;有限公司、北京联通、北京电信、北京移动共同协办的「北京论道暨第25届中国智能视听与科技创新高峰论坛」在北京隆重举行。 本届论道以“电视的未来与未来的电视”为主题&#…

java语言中方法的重载

文章目录 前言一、重载是什么&#xff1f;二、使用步骤 1.实操展示2.注意事项总结 前言 小时候&#xff0c;我们学会了十以内的加法&#xff0c;却对十以外的加法感到害怕&#xff0c;但从现在来看&#xff0c;它们都属于加法&#xff0c;只是计算方法略有不同。方法的重载也一…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 阿里巴巴找黄金宝箱(IV)

2023大厂笔试模拟练习网站&#xff08;含题解&#xff09; www.codefun2000.com 最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据&#xff0c;挂载到我们的OJ上&#xff0c;供大家学习交流&#xff0c;体会笔试难度。现已录入200道互联网大厂模拟练习题&a…

Computer Graphics From Scratch - Chapter 9

系列文章目录 简介&#xff1a;Computer Graphics From Scratch-《从零开始的计算机图形学》简介 第一章: Computer Graphics From Scratch - Chapter 1 介绍性概念 第二章&#xff1a;Computer Graphics From Scratch - Chapter 2 基本光线追踪 第三章&#xff1a;Computer Gr…

IEEE 最佳论文提名 | TraND:用步态算法优化身份识别

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;TraND: Transferable Neighborhood Discovery for Unsupervised Cross-domain Gait Recognition 论文链接: https://arxiv.org/pdf/2102.04621v1.pdf 步态识别开始应用在公共场域身份…

centos mysql安装配置远程访问

包含以下三个部分&#xff1a;mysql安装&#xff0c;mysql密码重置、mysql配置远程访问。 一 centos安装mysql 1、wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2、yum -y install mysql57-community-release-el7-10.noarch.rpm 3、yum…

to be delete

一、grafana版本升级 1.1 还是先跟着官网简单走一波 建议经常升级Grafana&#xff0c;以获取最新的修补程序和增强功能。 为了实现这一点&#xff0c;Grafana升级向后兼容&#xff0c;并且升级过程简单快捷。升级通常是安全的&#xff08;在许多次要版本和一个主要版本之间&a…