Python实现数字图像处理染色体计数示例

作者:悲恋花丶无心之人 时间:2022-06-15 03:32:36 

一、实验内容 

对于下面这幅图像,编程实现染色体计数,并附简要处理流程说明。

Python实现数字图像处理染色体计数示例

二、实验步骤

1.中值滤波

2.图像二值化

3.膨胀图像

4.腐蚀图像

5.计算光影背景

6.移除背景

7.检测染色体

三、代码

import cv2
import numpy as np
# 计算光影背景
def calculateLightPattern(img4):
   h, w = img4.shape[0], img4.shape[1]
   img5 = cv2.blur(img4, (int(w/3), int(w/3)))
   return img5
# 移除背景
def removeLight(img4, img5, method):
   if method == 1:
       img4_32 = np.float32(img4)
       img5_32 = np.float32(img5)
       ratio = img4_32 / img5_32
       ratio[ratio > 1] = 1
       aux = 1 - ratio
       # 按比例转换为8bit格式
       aux = aux * 255
       aux = np.uint8(aux)
   else:
       aux = img5 - img4
   return aux
def ConnectedComponents(aux):
   num_objects, labels = cv2.connectedComponents(aux)
   if num_objects < 2:
       print("connectedComponents未检测到染色体")
       return
   else:
       print("connectedComponents检测到染色体数量为:", num_objects - 1)
   output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)
   for i in range(1, num_objects):
       mask = labels == i
       output[:, :, 0][mask] = np.random.randint(0, 255)
       output[:, :, 1][mask] = np.random.randint(0, 255)
       output[:, :, 2][mask] = np.random.randint(0, 255)
   return output
def ConnectedComponentsStats(aux):
   num_objects, labels, status, centroids = cv2.connectedComponentsWithStats(aux)
   if num_objects < 2:
       print("connectedComponentsWithStats未检测到染色体")
       return
   else:
       print("connectedComponentsWithStats检测到染色体数量为:", num_objects - 1)
   output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)
   for i in range(1, num_objects):
       mask = labels == i
       output[:, :, 0][mask] = np.random.randint(0, 255)
       output[:, :, 1][mask] = np.random.randint(0, 255)
       output[:, :, 2][mask] = np.random.randint(0, 255)
   return output
def FindContours(aux):
   contours, hierarchy = cv2.findContours(aux, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
   if len(contours) == 0:
       print("findContours未检测到染色体")
       return
   else:
       print("findContours检测到染色体数量为:", len(contours))
   output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)
   for i in range(len(contours)):
       cv2.drawContours(
           output,
           contours,
           i,
           (np.random.randint(0, 255),
            np.random.randint(0, 255),
            np.random.randint(0, 255)), 2)
   return output
# 读取图片
img = cv2.imread('img.png', 0)
pre_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 二值化函数
# 第一步:中值滤波
# 中值滤波
img1 = cv2.medianBlur(img, 3)
# 显示并保存图片
cv2.imshow('gray', img)
cv2.imshow('medianBlur', img1)
cv2.imwrite('medianBlur.jpg', img1)
# 第二步:图像二值化
# 图像二值化
ret, img2 = cv2.threshold(img1, 140, 255, 0, img1)  # 二值化函数
# 显示并保存图片
cv2.imshow('threshold', img2)
cv2.imwrite('threshold.jpg', img2)
# 第三步:膨胀图像
dilate_kernel = np.ones((3, 3), np.uint8)
img3 = cv2.dilate(img2, dilate_kernel)
# 显示并保存图片
cv2.imshow('dilate', img3)
cv2.imwrite('dilate.jpg', img3)
# 第四步:腐蚀图像
erode_kernel = np.ones((7, 7), np.uint8)
img4 = cv2.erode(img3, erode_kernel)
# 显示并保存图片
cv2.imshow('erode', img4)
cv2.imwrite('erode.jpg', img4)
# 第五步:计算光影背景
img5 = calculateLightPattern(img4)
# 显示并保存图片
cv2.imshow('LightPattern', img5)
cv2.imwrite('LightPattern.jpg', img5)
# 第六步:移除背景
aux = removeLight(img4, img5, 1)
# 显示并保存图片
cv2.imshow('removeLight', aux)
cv2.imwrite('removeLight.jpg', aux)
# 第七步:检测轮廓
output1 = ConnectedComponents(aux)
output2 = ConnectedComponentsStats(aux)
output3 = FindContours(aux)
# 显示并保存图片
cv2.imshow('connectedComponents', output1)
cv2.imwrite('connectedComponents.jpg', output1)
cv2.imshow('connectedComponentsWithStats', output2)
cv2.imwrite('connectedComponentsWithStats.jpg', output2)
cv2.imshow('findContours', output3)
cv2.imwrite('findContours.jpg', output3)
cv2.waitKey(0)

四、结果

1.中值滤波

Python实现数字图像处理染色体计数示例

2.图像二值化

Python实现数字图像处理染色体计数示例

3.膨胀图像

Python实现数字图像处理染色体计数示例

4.腐蚀图像

Python实现数字图像处理染色体计数示例

5.计算光影背景

Python实现数字图像处理染色体计数示例

6.移除背景

Python实现数字图像处理染色体计数示例

7.检测染色体

(1)connectedComponents.jpg

Python实现数字图像处理染色体计数示例

(2)connectedComponentsWithStats.jpg

Python实现数字图像处理染色体计数示例

(3)findContours.jpg

Python实现数字图像处理染色体计数示例

染色体个数为46

来源:https://blog.csdn.net/qq_36556893/article/details/104497567

标签:Python,数字图像处理,染色体计数
0
投稿

猜你喜欢

  • 使用layui 的layedit定义自己的toolbar方法

    2023-08-24 16:21:43
  • Python 第三方opencv库实现图像分割处理

    2023-07-25 02:33:54
  • 网页设计配色色相之黄金分割

    2007-12-27 21:30:00
  • JS实现匀加速与匀减速运动的方法示例

    2024-06-07 15:27:36
  • Python异常处理操作实例详解

    2023-05-06 11:31:05
  • PyTorch中的C++扩展实现

    2021-06-24 15:52:30
  • python文件编译为pyc后运行的实现步骤

    2021-03-08 22:36:46
  • python通过函数属性实现全局变量的方法

    2023-08-25 04:54:20
  • 基于OpenCV(python)的实现文本分割之垂直投影法

    2023-11-17 08:45:39
  • python爬虫竟然被小伙用来算命

    2023-08-28 17:35:20
  • MySQL下使用Inplace和Online方式创建索引的教程

    2024-01-18 11:28:18
  • 让验证码友好一点

    2007-10-20 13:45:00
  • python利用smtplib实现QQ邮箱发送邮件

    2023-07-15 18:47:12
  • 对python3.4 字符串转16进制的实例详解

    2022-03-29 16:15:17
  • MYsql库与表的管理及视图介绍

    2024-01-25 21:33:06
  • python 顺时针打印矩阵的超简洁代码

    2023-03-25 14:03:52
  • python中实现修改图像分辨率大小

    2021-05-06 06:23:22
  • Flask框架学习笔记之消息提示与异常处理操作详解

    2021-05-17 15:03:02
  • FSO组件之文件操作(中)

    2010-05-03 11:05:00
  • Python OpenCV实现姿态识别的详细代码

    2023-05-27 23:42:31
  • asp之家 网络编程 m.aspxhome.com