diff --git a/实验五/test1.py b/实验五/test1.py index ef3993f..db5fc4b 100644 --- a/实验五/test1.py +++ b/实验五/test1.py @@ -6,8 +6,8 @@ # 5、生成二值图像:根据阈值的应用结果,将低于阈值的像素设置为一个固定的值(例如0),将高于阈值的像素设置为另一个固定的值(例如255),从而生成二值图像。 # 6、后处理(可选):根据实际需求,可以对生成的二值图像进行后处理操作,例如去除噪声、填充空洞等。 -import numpy as np; -import cv2 as cv; +import numpy as np +import cv2 as cv img=cv.imread('test1.png',cv.IMREAD_GRAYSCALE) cv.imshow('img',img) diff --git a/实验五/test2.py b/实验五/test2.py index e8c91ab..7889b78 100644 --- a/实验五/test2.py +++ b/实验五/test2.py @@ -7,3 +7,39 @@ # 6、计算分水岭:根据合并图像,应用分水岭变换算法来计算分水岭,即将图像分割成不同的分水岭区域。 # 7、降噪和后处理:对分割结果进行降噪和后处理,例如去除小的分割区域、填充空洞等,以获得最终的分割结果。 +import cv2 as cv +import numpy as np + +img = cv.imread('test1.png', cv.IMREAD_GRAYSCALE) +img = cv.blur(img, (5, 5)) +img = cv.convertScaleAbs(img, alpha=1.0, beta=2.0) +cv.imshow('origin', img) + +grad_x = cv.Sobel(img, cv.CV_32F, 1, 0, ksize=3) +grad_y = cv.Sobel(img, cv.CV_32F, 0, 1, ksize=3) +grad = cv.magnitude(grad_x, grad_y) + +ret, markers = cv.threshold(grad, 50, 255, cv.THRESH_BINARY) + +markers = np.uint8(markers) +dist_transform = cv.distanceTransform(255 - markers, cv.DIST_L2, 5) + +combined = cv.subtract(dist_transform, grad) + +image_rgb = cv.cvtColor(cv.imread('test1.png'), cv.COLOR_BGR2RGB) +markers = np.int32(markers) +markers[grad == 0] = 0 +markers += 1 +cv.watershed(image_rgb, markers) + +markers = np.where(markers == -1, 255, markers) +markers = np.uint8(markers) + +output = np.zeros_like(image_rgb) +output[markers == 255] = [0, 0, 255] +output[markers == 1] = [18, 0, 230] +output[markers == 0] = [255, 255, 255] + +cv.imshow('Segmentation Result', output) +cv.waitKey(0) +cv.destroyAllWindows()