溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

發(fā)布時(shí)間:2022-06-07 15:32:48 來源:億速云 閱讀:154 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)”吧!

一、實(shí)驗(yàn)內(nèi)容 

對(duì)于下面這幅圖像,編程實(shí)現(xiàn)染色體計(jì)數(shù),并附簡(jiǎn)要處理流程說明。

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

二、實(shí)驗(yàn)步驟

1.中值濾波

2.圖像二值化

3.膨脹圖像

4.腐蝕圖像

5.計(jì)算光影背景

6.移除背景

7.檢測(cè)染色體

三、代碼

import cv2
import numpy as np
# 計(jì)算光影背景
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
        # 按比例轉(zhuǎn)換為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未檢測(cè)到染色體")
        return
    else:
        print("connectedComponents檢測(cè)到染色體數(shù)量為:", 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未檢測(cè)到染色體")
        return
    else:
        print("connectedComponentsWithStats檢測(cè)到染色體數(shù)量為:", 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未檢測(cè)到染色體")
        return
    else:
        print("findContours檢測(cè)到染色體數(shù)量為:", 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)  # 二值化函數(shù)
# 第一步:中值濾波
# 中值濾波
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)  # 二值化函數(shù)
# 顯示并保存圖片
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)
# 第五步:計(jì)算光影背景
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)
# 第七步:檢測(cè)輪廓
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)

四、結(jié)果

1.中值濾波

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

2.圖像二值化

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

3.膨脹圖像

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

4.腐蝕圖像

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

5.計(jì)算光影背景

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

6.移除背景

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

7.檢測(cè)染色體

(1)connectedComponents.jpg

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

(2)connectedComponentsWithStats.jpg

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

(3)findContours.jpg

Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)

染色體個(gè)數(shù)為46

到此,相信大家對(duì)“Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI