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.中值滤波

2.图像二值化

3.膨胀图像

4.腐蚀图像

5.计算光影背景

6.移除背景

7.检测染色体

(1)connectedComponents.jpg

(2)connectedComponentsWithStats.jpg

(3)findContours.jpg

染色体个数为46

以上就是Python实现数字图像处理染色体计数示例的详细内容,更多关于Python数字图像处理染色体计数的资料请关注我们其它相关文章!

(0)

相关推荐

  • python数字图像处理之估计噪声参数

    估计噪声参数 周期噪声的参数通常是通过检测图像的傅里叶谱来估计的. 只能使用由传感器生成的图像时,可由一小片恒定的背景灰度来估计PDF的参数. 来自图像条带的数据的最简单用途是,计算灰度级的均值和方差.考虑由 S S S表示的一个条带(子图像),并令 P S ( z i ) P_{S}(z_i) PS​(zi​), i = 0 , 1 , 2 , - , L − 1 i = 0, 1, 2, \dots, L-1 i=0,1,2,-,L−1表示 S S S中的像素灰度的概率估计(归一化直方图值)

  • Python数字图像处理基础直方图详解

    目录 直方图的定义 直方图的性质 直方图的应用 图像增强 图像分割 图像识别 Python直方图的计算 直方图的定义 直方图的性质 只统计某个灰度级出现的次数,图像的大小不一样的话, 某灰度值的像素出现的次数是不一样的. 那如果我们在这基础上除以像素总个数的话,那就是某一灰度级出现的概率,那么这样的话不同大小的同一内容图像其灰度直方图是一样的. 直方图的应用 图像增强 图像分割 图像识别 Python直方图的计算 import cv2 import numpy as np import matp

  • Python线性点运算数字图像处理示例详解

    目录 点运算 定义 分类 线性点运算 分段线性点运算 非线性点运算 对数变换 幂次变换 点运算 定义 分类 线性点运算 例子: 分段线性点运算 非线性点运算 对数变换 幂次变换 1. 点运算是否会改变图像内像素点之间的空间位置关系? 点运算是一种像素的逐点运算,它与相邻的像素之间没有运算关系,点运算不会改变图像内像素点之间的空间位置关系. 2. 对图像灰度的拉伸,非线性拉伸与分段线性拉伸的区别? 非线性拉伸不是通过在不同灰度值区间选择不同的线性方程来实现对不同灰度值区间的扩展与压缩,而是在整个灰

  • Python+OpenCV数字图像处理之ROI区域的提取

    目录 1.实现原理 2.使用的函数简述 3.代码实现过程 (1)读入原始图像 (2)获取mask (3)获取人物mask (4)获取人物 (5)新建一张与原始图一样大小的蓝色的背景图 (6)得到蓝色背景的mask 4.整体代码  利用mask(掩模)技术提取纯色背景图像ROI区域中的人和物,并将提取出来的人或物添加在其他图像上. 1.实现原理 先通过cv.cvtColor()函数,将原RGB彩色图像转换为hsv色彩空间的图像,然后通过cv.inRange()函数获得ROI区域的Mask,最后利用

  • Python数字图像处理代数之加减乘运算

    目录 代数运算 定义 加法运算 减法运算 乘法运算 代数运算 定义 加法运算 图像叠加需要满足该条件:两幅图像的像素必须相同(尺寸,形状) 减法运算 乘法运算 1.图像的局部显示. 2.用二值蒙版图像与原图像做乘法. 以上就是Python数字图像处理代数之加减乘运算的详细内容,更多关于Python数字图像处理代数运算的资料请关注我们其它相关文章!

  • 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.b

  • 如何基于Python实现数字类型转换

    这篇文章主要介绍了如何基于Python实现数字类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python数字类型转换: int(x):将 x 转换为一个整数 float(x):将 x 转换为一个浮点数 complex(x,y):将 x 和 y 转换为一个复数.x 为复数的实部,y 为复数的虚部. eval(x):将 x 转化为一个整数 chr(x):x 为数字,将数字转化为对应的 ASCII 码. 65 -> A .90 -> Z

  • python数字图像处理像素的访问与裁剪示例

    目录 引言 引言 图片读入程序中后,是以numpy数组存在的.因此对numpy数组的一切功能,对图片也适用.对数组元素的访问,实际上就是对图片像素点的访问. 彩色图片访问方式为: img[i,j,c] i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2).坐标是从左上角开始. 灰度图片访问方式为: gray[i,j] 例1:输出小猫图片的G通道中的第20行30列的像素值 from skimage import io,data img=data.chelsea(

  • python数字图像处理环境安装与配置过程示例

    目录 引言 一.需要的安装包 二.下载并安装 anaconda 三.简单测试 四.skimage包的子模块 引言 一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此,我们这里使用python这个脚本语言来进行数字图像处理. 要使用python,必须先安装python,一般是2.7版本以上,不管是在windows系统,还是linux系统,安装都是非

  • python数字图像处理之图像自动阈值分割示例

    目录 引言 1.threshold_otsu 2.threshold_yen 3.threshold_li 4.threshold_isodata 5.threshold_adaptive 引言 图像阈值分割是一种广泛应用的分割技术,利用图像中要提取的目标区域与其背景在灰度特性上的差异,把图像看作具有不同灰度级的两类区域(目标区域和背景区域)的组合,选取一个比较合理的阈值,以确定图像中每个像素点应该属于目标区域还是背景区域,从而产生相应的二值图像. 在skimage库中,阈值分割的功能是放在fi

  • python数字图像处理之对比度与亮度调整示例

    目录 skimage包的exposure模块 1.gamma调整 2.log对数调整 3.判断图像对比度是否偏低 4.调整强度 skimage包的exposure模块 图像亮度与对比度的调整,是放在skimage包的exposure模块里面 1.gamma调整 对原图像的像素,进行幂运算,得到新的像素值.公式中的g就是gamma值. 如果gamma>1, 新图像比原图像暗 如果gamma<1,新图像比原图像亮 函数格式为:skimage.exposure.adjust_gamma(image,

  • python数字图像处理之高级滤波代码详解

    本文提供许多的滤波方法,这些方法放在filters.rank子模块内. 这些方法需要用户自己设定滤波器的形状和大小,因此需要导入morphology模块来设定. 1.autolevel 这个词在photoshop里面翻译成自动色阶,用局部直方图来对图片进行滤波分级. 该滤波器局部地拉伸灰度像素值的直方图,以覆盖整个像素值范围. 格式:skimage.filters.rank.autolevel(image, selem) selem表示结构化元素,用于设定滤波器. from skimage im

  • python数字图像处理skimage读取显示与保存图片

    目录 引言 一.从外部读取图片并显示 二.程序自带图片 三.保存图片 四.图片信息 引言 skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的.为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,我们可以直接使用. 引入skimage模块可用: from skimage import io 一.从外部读取图片并显示 读取单张彩色rgb图片,使用skimage.io.imread(fname)函数,带一个参数,表示需要读取的文件路径.显示图片使用skimage.io.

随机推荐