输入的图像一般都是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()

实验结果展示:


数字图像处理——红眼去除(Python)相关推荐

  1. 数字图像处理——实验一 Python中数字图像处理的基本操作

    数字图像处理--实验一 Python中数字图像处理的基本操作 一.实验目的 二.实验主要仪器设备 三.实验原理 3.1 数字图像的表示和类别 3.2 opencv-python图像文件格式 四.实验内 ...

  2. 数字图像处理 python_5使用Python处理数字的高级操作

    数字图像处理 python Numbers are everywhere in our daily life - there are phone numbers, dates of birth, ag ...

  3. 基于Opencv的数字图像处理技巧(python)

    图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术.又称影像处理.图像处理一般指数字图像处理.数字图像是指用工业相机.摄像机.扫描仪等设备经过拍摄得到的一个大的 ...

  4. 数字图像处理 使用opencv+python识别七段数码显示器的数字

    一.什么是七段数码显示器 七段LCD数码显示器有很多叫法:段码液晶屏.段式液晶屏.黑白笔段屏.段码LCD液晶屏.段式显示器.TN液晶屏.段码液晶显示器.段码屏幕.笔段式液晶屏.段码液晶显示屏.段式LC ...

  5. 数字图像处理之用Python+GDAL实现BSQ格式转换为BIP格式,BIL格式转换为BSQ,BIP格式

    1.环境:PyCharm2022.2.3+Python3.9.1+GDAL(GDAL-3.4.3-cp39-cp39-win_amd64) 2.概念: (1)BSQ (band sequential) ...

  6. 数字图像处理 染色体计数 Python实现

    目录 一.实验内容 二.实验步骤 三.代码 四.结果 一.实验内容 对于下面这幅图像,编程实现染色体计数,并附简要处理流程说明. 二.实验步骤 1.中值滤波 2.图像二值化 3.膨胀图像 4.腐蚀图像 ...

  7. (附源码)python数字图像处理课程平台 毕业设计 242339

    Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  8. (附源码)Python数字图像处理课程平台 毕业设计242339

    Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  9. 数字图像处理与Python实现笔记之图像特征提取

    数字图像处理与Python实现笔记 摘要 绪论 1 数字图像处理基础知识 2 彩色图像处理初步 3 空间滤波 4 频域滤波 5 图像特征提取 5.1 图像颜色特征提取 5.1.1 颜色直方图 1 一般 ...

最新文章

  1. c++ gdb 绑定源码_【Vue原理】VNode 源码版
  2. 将信息系学生的计算机文化学,计算机学生论文,关于基于职业岗位的计算机文化基础课教学相关参考文献资料-免费论文范文...
  3. 决策树算法详解(2)
  4. 对话国际农民丰收节贸易会-林育庆:菲律宾谋定中国农业
  5. os.walk获取同级目录具有随机性
  6. Brew安装MacVim
  7. python 字符串转换
  8. 二维树状数组的区间加减及查询 tyvj 1716 上帝造题的七分钟
  9. 六自由度机械臂研究(2)- 机械臂坐标系建立
  10. Spire.PDF帮你高效搞定PDF打印
  11. 蓝牙音箱方案选用及设计注意
  12. down mark 打钩_[MarkDown] markdown语法小结
  13. 79元限抢Jeep专柜「冰丝速干裤」!穿上它让你“胯下生风”,比裸奔还爽!
  14. scrapy 爬取淘宝商品评论信息
  15. 华为鸿蒙小插件,mate30pro鸿蒙系统无法加载时钟小部件
  16. TinyPng批量压缩图片
  17. 如何做好用户故事地图?
  18. Pandas 时间序列 - 实例方法与重采样
  19. java多线程:9、synchronized、Lock的底层实现原理以及和volatile、Lock、ReentrantLock的区别?
  20. linux英文字典,linux终端下的英文字典--SDCV(转)

热门文章

  1. 【飞桨】win10-paddle-GPU环境配置
  2. 腾讯棋牌开发商(深圳泊众):投身网络棋牌游戏有风险
  3. EST封面: 南方科技大学夏雨团队
  4. 【习题5】用Python完成新建文档写古诗+复制
  5. html横向滚动效果,html 中 鼠标滑轮实现横向滚动
  6. word设置图片上边空白24点,下边9点,图片和图注在一行怎么办?
  7. 微信小程序 js创建Object对象
  8. js 实现随机抽取选餐效果源码
  9. 滤镜怎么调好看?分享给图片调色的教程
  10. matlab迭代实现矩阵运算,用matlab实现Rayleigh迭代计算矩阵特征值的程序