数字图像处理——红眼去除(Python)

news/2024/10/18 2:32:37/

输入的图像一般都是RGB三层,但是红眼区域的定义是在HSI空间上进行定义,因此需要存在两个函数将图像数据在RGB空间与HSI空间进行转换,而转换的公式如下图所示:
在这里插入图片描述
在这里插入图片描述

原始图片数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验代码:

import mathimport cv2
import numpy as npglobal img, ans
global point1, point2readroad = '.\\data\\'
saveroad = '.\\ans\\'
picname = 'cateye.jpg'
# picname ='12031565.jpg'
# picname = 'child-red eye.jpg'def rgb2hsi(R, G, B):m = R - (G + B) / 2n = cv2.multiply(R - G, R - G) + cv2.multiply(R - B, G - B)theta = np.zeros([R.shape[0], R.shape[1]])eps = 0.000001  # 定义一个微小量,避免出现分母为0至分式错误# 下面按照公式进行变换for i in range(R.shape[0]):for j in range(R.shape[1]):theta[i, j] = math.acos(m[i, j] / math.sqrt(n[i, j] + eps))H = theta.copy()mid = B > GH[mid] = 2 * math.pi - theta[mid] # 给HSI空间中的H赋值S = np.zeros([R.shape[0], R.shape[1]])for i in range(R.shape[0]):for j in range(R.shape[1]):S[i, j] = 1 - (3 * min(R[i, j], G[i, j], B[i, j]) / (R[i, j] + G[i, j] + B[i, j] + eps)) # 给HSI空间中的S赋值I = (R + G + B) / 3  # 给HSI空间中的I赋值return H, S, Idef hsi2rgb(H, S, I):mid = math.pi * 2 / 3  # 首先将120度转换为弧度制便于判定R = np.zeros([H.shape[0], H.shape[1]])  # 初始化R,G,B矩阵G = np.zeros([H.shape[0], H.shape[1]])B = np.zeros([H.shape[0], H.shape[1]])for i in range(H.shape[0]):for j in range(H.shape[1]):# 以下按情况进行分类讨论if H[i, j] <= mid:R[i, j] = I[i, j] * (1 + S[i, j] * math.cos(H[i, j]) / math.cos(0.5 * mid - H[i, j]))B[i, j] = I[i, j] * (1 - S[i, j])G[i, j] = 3 * I[i, j] - (R[i, j] + B[i, j])elif (H[i, j] <= mid * 2) and H[i, j] > mid:H[i, j] = H[i, j] - midG[i, j] = I[i, j] * (1 + S[i, j] * math.cos(H[i, j]) / math.cos(0.5 * mid - H[i, j]))R[i, j] = I[i, j] * (1 - S[i, j])B[i, j] = 3 * I[i, j] - (R[i, j] + G[i, j])elif (H[i, j] <= mid * 3) and H[i, j] > mid * 2:H[i, j] = H[i, j] - mid * 2B[i, j] = I[i, j] * (1 + S[i, j] * math.cos(H[i, j]) / math.cos(0.5 * mid - H[i, j]))G[i, j] = I[i, j] * (1 - S[i, j])R[i, j] = 3 * I[i, j] - (B[i, j] + G[i, j])return R, G, Bdef on_mouse(event, x, y, flags, param):global img, ans, point1, point2img1 = img.copy()if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击point1 = (x, y) # 获取一个角点坐标cv2.circle(img1, point1, 10, (0, 255, 0), 1)cv2.imshow('image', img1)elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON):  # 按住左键拖曳cv2.rectangle(img1, point1, (x, y), (255, 0, 0), 1)cv2.imshow('image', img1)elif event == cv2.EVENT_LBUTTONUP:  # 左键释放point2 = (x, y) # 获取对角角点坐标cv2.rectangle(img1, point1, point2, (0, 0, 255), 1)cv2.imshow('image', img1)img2 = ans.astype(np.int32) # 转换数据类型方便进行运算# 注意读入的图像三层分别对应RGB空间的B,G,RH, S, I = rgb2hsi(img2[:, :, 2], img2[:, :, 1], img2[:, :, 0])min_x = min(point1[0], point2[0]) # 获取待处理区域信息min_y = min(point1[1], point2[1])width = abs(point1[0] - point2[0])height = abs(point1[1] - point2[1])# 按照红眼定义在指定区域进行去红眼处理for i in range(min_y, min_y + height + 1):for j in range(min_x, min_x + width + 1):# m,n=H[i, j],S[i, j]if (H[i, j] < math.pi / 4) or H[i, j] > math.pi * 7 / 4:if S[i, j] > 0.25:S[i, j] = 0R, G, B = hsi2rgb(H, S, I)# 构造去红眼的结果影像mid = np.zeros([R.shape[0], R.shape[1], 3])mid[:, :, 0] = Bmid[:, :, 1] = Gmid[:, :, 2] = Rans = mid.astype(np.uint8) # 转换数据类型方便结果展示与保存cv2.imshow('image1', ans)cv2.imwrite(saveroad + picname + '_outred.jpg', ans)def main():global img, ansimg = cv2.imread(readroad + picname)ans = img.copy()cv2.namedWindow('image')cv2.setMouseCallback('image', on_mouse)cv2.imshow('image', ans)cv2.waitKey(0)if __name__ == '__main__':main()

实验结果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/784116.html

相关文章

k8s的资源配置清单的管理操作

目录 一、资源配置清单1.1 初步认识资源清单中svc的重要配置项1.2 手动编写 svc资源配置1.3 手动生成模板&#xff0c;再编写资源清单1.4 写yaml太累怎么办&#xff1f;1.5 官网下载资源模板 一、资源配置清单 Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#…

sqlserver数据库命令行客户端安装

项目情况 项目上需要通过执行sql语句去更新一些功能 直接进入数据库去进行执行太麻烦&#xff0c; 对基础技术人员的要求比较高&#xff0c;执行效率低 参考资料 sqlcmd 实用工具 - SQL Server | Microsoft Learn 下载 ODBC Driver for SQL Server - ODBC Driver for SQL S…

Windows 10 启动出现蓝屏 终止代码:UNMOUNTABLE_BOOT_VOLUME

解决办法&#xff1a;在命令符窗口中【管理员权限】 1、– 修复Windows文件&#xff1a;损坏的Windows文件可能会导致严重的问题。 sfc /scannow2 、– 修复硬盘&#xff1a;确保您的硬盘依次运行&#xff0c;以及Windows。 chkdsk c: /f 或 chkdsk /f 或 chkdsk /r

win10蓝屏:终止代码:CRITICAL_PROCESS_DIED

1.硬件驱动问题 Win X打开设备管理器-扫描检测硬件改动 看是否有硬件驱动问题&#xff08;黄色标识&#xff09;&#xff0c;有的话更新或卸载重装 2.查看蓝屏原因 使用软件&#xff1a; BlueScreenView WinX - 时间查看器 window日志-系统&#xff1a;红色错误标识为系统错误…

windows10打印蓝屏 失败的操作win32kfull.sys 终止代码 APC-INDEX-MISMATCH解决方法

1、打开控制面板&#xff08;可以在右下角搜索栏搜索“控制面板”&#xff09; 2、找到点击卸载程序 3、弹出程序和功能点击&#xff08;查看已安装的更新&#xff09; 4、卸载微软更新补丁&#xff08;kb5000808&#xff09; 5、如果想关闭微软系统更新打开设置——点击更…

Pytorch—提前终止代码

前言 以前使用keras的时候有一个很方便的提前终止类&#xff0c;而pytorch每次都要自己写一次&#xff0c;因此我整理了一个简单通用的代码&#xff0c;需要提前终止功能时&#xff0c;只需cv一下&#xff0c;避免了每次重复写的麻烦。 代码 class EarlyStopping(object):de…

windows10启动虚拟机就会蓝屏,终止代码:SYSTEM_SERVICE_EXCEPTION(全网权威解决方法!)

前言 没错就是这个,绿色的死亡按钮 原因: 第一种:windows更新原因,正是因为windows系统更新了造成了系统与软件之间不兼容!第二种:没有第二种,(狗头.jpg) 解决方案: 既然是更新问题,就把最近更新的补丁卸载了就行! 进入程序和功能,看安装时间&#xff0c;找到上一次更新时…

w ndows10如何取消开机自动修复,win10专业版开机报错,自动修复失败。(终止代码WDF VIOLATION)...

win10专业版开机报错&#xff0c;自动修复失败。(终止代码WDF VIOLATION) 下面是SrtTrail.txt文档内容&#xff1a; 启动修复诊断和修复日志 --------------------------- 尝试修复次数:1 会话详细信息 --------------------------- 系统磁盘 \Device\Harddisk0 Windows 目录 …