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

举报
悲恋花丶无心之人 发表于 2021/02/02 23:41:20 2021/02/02
【摘要】 目录 一、实验内容  二、实验步骤 三、代码 四、结果 一、实验内容  对于下面这幅图像,编程实现染色体计数,并附简要处理流程说明。 二、实验步骤 1.中值滤波 2.图像二值化 3.膨胀图像 4.腐蚀图像 5.计算光影背景 6.移除背景 7.检测染色体 三、代码 import cv2import numpy as np # 计算光影背景d...

目录

一、实验内容 

二、实验步骤

三、代码

四、结果


一、实验内容 

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

二、实验步骤

1.中值滤波

2.图像二值化

3.膨胀图像

4.腐蚀图像

5.计算光影背景

6.移除背景

7.检测染色体

三、代码


  
  1. import cv2
  2. import numpy as np
  3. # 计算光影背景
  4. def calculateLightPattern(img4):
  5. h, w = img4.shape[0], img4.shape[1]
  6. img5 = cv2.blur(img4, (int(w/3), int(w/3)))
  7. return img5
  8. # 移除背景
  9. def removeLight(img4, img5, method):
  10. if method == 1:
  11. img4_32 = np.float32(img4)
  12. img5_32 = np.float32(img5)
  13. ratio = img4_32 / img5_32
  14. ratio[ratio > 1] = 1
  15. aux = 1 - ratio
  16. # 按比例转换为8bit格式
  17. aux = aux * 255
  18. aux = np.uint8(aux)
  19. else:
  20. aux = img5 - img4
  21. return aux
  22. def ConnectedComponents(aux):
  23. num_objects, labels = cv2.connectedComponents(aux)
  24. if num_objects < 2:
  25. print("connectedComponents未检测到染色体")
  26. return
  27. else:
  28. print("connectedComponents检测到染色体数量为:", num_objects - 1)
  29. output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)
  30. for i in range(1, num_objects):
  31. mask = labels == i
  32. output[:, :, 0][mask] = np.random.randint(0, 255)
  33. output[:, :, 1][mask] = np.random.randint(0, 255)
  34. output[:, :, 2][mask] = np.random.randint(0, 255)
  35. return output
  36. def ConnectedComponentsStats(aux):
  37. num_objects, labels, status, centroids = cv2.connectedComponentsWithStats(aux)
  38. if num_objects < 2:
  39. print("connectedComponentsWithStats未检测到染色体")
  40. return
  41. else:
  42. print("connectedComponentsWithStats检测到染色体数量为:", num_objects - 1)
  43. output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)
  44. for i in range(1, num_objects):
  45. mask = labels == i
  46. output[:, :, 0][mask] = np.random.randint(0, 255)
  47. output[:, :, 1][mask] = np.random.randint(0, 255)
  48. output[:, :, 2][mask] = np.random.randint(0, 255)
  49. return output
  50. def FindContours(aux):
  51. contours, hierarchy = cv2.findContours(aux, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  52. if len(contours) == 0:
  53. print("findContours未检测到染色体")
  54. return
  55. else:
  56. print("findContours检测到染色体数量为:", len(contours))
  57. output = np.zeros((aux.shape[0], aux.shape[1], 3), np.uint8)
  58. for i in range(len(contours)):
  59. cv2.drawContours(
  60. output,
  61. contours,
  62. i,
  63. (np.random.randint(0, 255),
  64. np.random.randint(0, 255),
  65. np.random.randint(0, 255)), 2)
  66. return output
  67. # 读取图片
  68. img = cv2.imread('img.png', 0)
  69. pre_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 二值化函数
  70. # 第一步:中值滤波
  71. # 中值滤波
  72. img1 = cv2.medianBlur(img, 3)
  73. # 显示并保存图片
  74. cv2.imshow('gray', img)
  75. cv2.imshow('medianBlur', img1)
  76. cv2.imwrite('medianBlur.jpg', img1)
  77. # 第二步:图像二值化
  78. # 图像二值化
  79. ret, img2 = cv2.threshold(img1, 140, 255, 0, img1) # 二值化函数
  80. # 显示并保存图片
  81. cv2.imshow('threshold', img2)
  82. cv2.imwrite('threshold.jpg', img2)
  83. # 第三步:膨胀图像
  84. dilate_kernel = np.ones((3, 3), np.uint8)
  85. img3 = cv2.dilate(img2, dilate_kernel)
  86. # 显示并保存图片
  87. cv2.imshow('dilate', img3)
  88. cv2.imwrite('dilate.jpg', img3)
  89. # 第四步:腐蚀图像
  90. erode_kernel = np.ones((7, 7), np.uint8)
  91. img4 = cv2.erode(img3, erode_kernel)
  92. # 显示并保存图片
  93. cv2.imshow('erode', img4)
  94. cv2.imwrite('erode.jpg', img4)
  95. # 第五步:计算光影背景
  96. img5 = calculateLightPattern(img4)
  97. # 显示并保存图片
  98. cv2.imshow('LightPattern', img5)
  99. cv2.imwrite('LightPattern.jpg', img5)
  100. # 第六步:移除背景
  101. aux = removeLight(img4, img5, 1)
  102. # 显示并保存图片
  103. cv2.imshow('removeLight', aux)
  104. cv2.imwrite('removeLight.jpg', aux)
  105. # 第七步:检测轮廓
  106. output1 = ConnectedComponents(aux)
  107. output2 = ConnectedComponentsStats(aux)
  108. output3 = FindContours(aux)
  109. # 显示并保存图片
  110. cv2.imshow('connectedComponents', output1)
  111. cv2.imwrite('connectedComponents.jpg', output1)
  112. cv2.imshow('connectedComponentsWithStats', output2)
  113. cv2.imwrite('connectedComponentsWithStats.jpg', output2)
  114. cv2.imshow('findContours', output3)
  115. cv2.imwrite('findContours.jpg', output3)
  116. cv2.waitKey(0)

四、结果

1.中值滤波

2.图像二值化

3.膨胀图像

4.腐蚀图像

5.计算光影背景

6.移除背景

7.检测染色体

(1)connectedComponents.jpg

(2)connectedComponentsWithStats.jpg

(3)findContours.jpg

染色体个数46

 

文章来源: nickhuang1996.blog.csdn.net,作者:悲恋花丶无心之人,版权归原作者所有,如需转载,请联系作者。

原文链接:nickhuang1996.blog.csdn.net/article/details/104497567

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。