本篇內(nèi)容主要講解“Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python如何實(shí)現(xiàn)數(shù)字圖像處理染色體計(jì)數(shù)”吧!
對(duì)于下面這幅圖像,編程實(shí)現(xiàn)染色體計(jì)數(shù),并附簡(jiǎ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)
1.中值濾波
2.圖像二值化
3.膨脹圖像
4.腐蝕圖像
5.計(jì)算光影背景
6.移除背景
7.檢測(cè)染色體
(1)connectedComponents.jpg
(2)connectedComponentsWithStats.jpg
(3)findContours.jpg
染色體個(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í)!
免責(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)容。