本帖最后由 holybang 于 2025-10-15 21:01 编辑
对应Halcon代码如下:
- FilePaths := ['i (0).png', 'i (1).png', 'i (2).png', 'i (3).png', 'i (4).png', 'i (5).png']
- for Index := 0 to 5 by 1
-
- tuple_select (FilePaths, Index, FilePath)
- read_image (Image, FilePath)
-
- scale_image_range(Image, ImageScaled, 20000, 60000)
- convert_image_type(ImageScaled, Image8u, 'byte')
-
- gen_disc_se(SE, 'byte', 31, 31, 1)
- gray_bothat (Image8u, SE, ImageBotHat)
-
- threshold(ImageBotHat, SmallRegions, 87, 255)
- connection(SmallRegions, ConnectedSmallRegions)
- select_shape (ConnectedSmallRegions, SelectedSmallRegions1, ['area'], ['and'], [5], [200])
-
- select_gray(SelectedSmallRegions1, Image8u, SelectedSmallRegions2, 'mean', 'and', 0, 30)
-
- threshold(Image8u, BigRegions, 0, 25)
- connection(BigRegions, ConnectedBigRegions)
- select_shape(ConnectedBigRegions, SelectedBigRegions, 'area', 'and', 100, 99999)
-
- concat_obj(SelectedBigRegions, SelectedSmallRegions2, ResultRegions)
-
- threshold(ImageBotHat, BoundaryDefectRegions, 110, 255)
-
- smooth_image(Image8u, ImageSmooth,'gauss', 30)
- threshold(ImageSmooth, BoundaryRegions, 90, 255)
- intersection(BoundaryRegions, BoundaryDefectRegions, BoundaryDefectRegions)
- connection(BoundaryDefectRegions, ConnectedBoundaryDefectRegions)
- select_shape(ConnectedBoundaryDefectRegions, SelectedBoundaryDefectRegions, 'area', 'and', 10, 99999)
- select_gray(SelectedBoundaryDefectRegions, Image8u, SelectedBoundaryDefectRegions2, 'mean', 'and', 0, 60)
-
- concat_obj(SelectedBoundaryDefectRegions2, ResultRegions, ResultRegions)
-
- gen_disc_se(SE, 'byte', 7, 7, 1)
- dilation1 (ResultRegions, SE, RegionDilation, 3)
-
- overpaint_region(Image8u, RegionDilation, 255, 'margin')
-
- tuple_str_replace (FilePath, '.png', '_result.png', ResultFilePath)
- write_image(Image8u, 'png', 0, ResultFilePath)
- endfor
复制代码
OpenCV代码如下:
- import cv2
- import numpy as np
- file_paths = ['i (1).png', 'i (2).png', 'i (3).png', 'i (4).png', 'i (5).png']
- for index, file_path in enumerate(file_paths):
- # 读取图像(支持 8/16 位)
- image = cv2.imread(file_path, cv2.IMREAD_UNCHANGED)
-
- # 确保图像为 16 位
- if image.dtype == np.uint8:
- image = image.astype(np.uint16)
- image[image < 20000] = 20000
- image[image > 60000] = 60000
-
- image_8u = ((image - 20000) / (60000 - 20000) * 255).astype(np.uint8)
-
- kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (31, 31))
- image_bot_hat = cv2.morphologyEx(image_8u, cv2.MORPH_BLACKHAT, kernel)
- _, small_regions = cv2.threshold(image_bot_hat, 87, 255, cv2.THRESH_BINARY)
- num_labels, labels = cv2.connectedComponents(small_regions, connectivity=8)
- selected_small_regions1 = np.zeros_like(labels)
- for i in range(1, num_labels):
- area = np.sum(labels == i)
- if 5 <= area <= 200:
- selected_small_regions1[labels == i] = 255
-
- selected_small_regions2 = np.zeros_like(labels)
- for i in range(1, num_labels):
- if np.any(selected_small_regions1 == 255):
- mean_val = np.mean(image_8u[labels == i])
- if 0 <= mean_val <= 30:
- selected_small_regions2[labels == i] = 255
-
- _, big_regions = cv2.threshold(image_8u, 25, 255, cv2.THRESH_BINARY_INV)
- num_labels_big, labels_big = cv2.connectedComponents(big_regions, connectivity=8)
-
- selected_big_regions = np.zeros_like(labels_big)
- for i in range(1, num_labels_big):
- area = np.sum(labels_big == i)
- if 100 <= area <= 99999:
- selected_big_regions[labels_big == i] = 255
- result_regions = np.bitwise_or(selected_small_regions2, selected_big_regions)
-
- kernel_dilate = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
- region_dilation = cv2.dilate(result_regions.astype(np.uint8), kernel_dilate, iterations=3)
- region_dilation_bin = (region_dilation > 0).astype(np.uint8) * 255
-
- contours, _ = cv2.findContours(region_dilation_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
-
- cv2.drawContours(image_8u, contours, -1, 255, 1)
-
- result_file_path = file_path.replace('.png', '_result.png')
-
- cv2.imwrite(result_file_path, image_8u)
- print("处理完成")
复制代码
|