设置首页收藏本站
开启左侧

找异物--求助各位大佬给点思路

[复制链接]
虎虎虎 发表于 2025-9-30 16:08:52 | 显示全部楼层 |阅读模式
如图需要找出产品中的异物

圈中的为异物

圈中的为异物

这个是原图

这个是原图

这个是无异物的图像

这个是无异物的图像

异物图像2

异物图像2

异物图像3

异物图像3

异物图像4

异物图像4
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
大凡光学,专注标定板提供
holybang 发表于 2025-10-7 21:01:19 | 显示全部楼层
本帖最后由 holybang 于 2025-10-15 21:01 编辑

i (0)_result.png i (1)_result.png i (2)_result.png i (3)_result.png i (4)_result.png i (5)_result.png
对应Halcon代码如下:
  1. FilePaths := ['i (0).png', 'i (1).png', 'i (2).png', 'i (3).png', 'i (4).png', 'i (5).png']

  2. for Index := 0 to 5 by 1
  3.    
  4.     tuple_select (FilePaths, Index, FilePath)
  5.     read_image (Image, FilePath)
  6.         
  7.     scale_image_range(Image, ImageScaled, 20000, 60000)
  8.     convert_image_type(ImageScaled, Image8u, 'byte')
  9.    
  10.     gen_disc_se(SE, 'byte', 31, 31, 1)
  11.     gray_bothat (Image8u, SE, ImageBotHat)
  12.    
  13.     threshold(ImageBotHat, SmallRegions, 87, 255)
  14.     connection(SmallRegions, ConnectedSmallRegions)
  15.     select_shape (ConnectedSmallRegions, SelectedSmallRegions1, ['area'], ['and'], [5], [200])
  16.    
  17.     select_gray(SelectedSmallRegions1, Image8u, SelectedSmallRegions2, 'mean', 'and', 0, 30)
  18.    
  19.     threshold(Image8u, BigRegions, 0, 25)
  20.     connection(BigRegions, ConnectedBigRegions)
  21.     select_shape(ConnectedBigRegions, SelectedBigRegions, 'area', 'and', 100, 99999)
  22.    
  23.     concat_obj(SelectedBigRegions, SelectedSmallRegions2, ResultRegions)
  24.    
  25.     threshold(ImageBotHat, BoundaryDefectRegions, 110, 255)
  26.    
  27.     smooth_image(Image8u, ImageSmooth,'gauss', 30)
  28.     threshold(ImageSmooth, BoundaryRegions, 90, 255)
  29.     intersection(BoundaryRegions, BoundaryDefectRegions, BoundaryDefectRegions)
  30.     connection(BoundaryDefectRegions, ConnectedBoundaryDefectRegions)
  31.     select_shape(ConnectedBoundaryDefectRegions, SelectedBoundaryDefectRegions, 'area', 'and', 10, 99999)
  32.     select_gray(SelectedBoundaryDefectRegions, Image8u, SelectedBoundaryDefectRegions2, 'mean', 'and', 0, 60)
  33.    
  34.     concat_obj(SelectedBoundaryDefectRegions2, ResultRegions, ResultRegions)
  35.    
  36.     gen_disc_se(SE, 'byte', 7, 7, 1)
  37.     dilation1 (ResultRegions, SE, RegionDilation, 3)
  38.    
  39.     overpaint_region(Image8u, RegionDilation, 255, 'margin')
  40.    
  41.     tuple_str_replace (FilePath, '.png', '_result.png', ResultFilePath)
  42.     write_image(Image8u, 'png', 0, ResultFilePath)
  43. endfor


复制代码



OpenCV代码如下:

  1. import cv2
  2. import numpy as np

  3. file_paths = ['i (1).png', 'i (2).png', 'i (3).png', 'i (4).png', 'i (5).png']

  4. for index, file_path in enumerate(file_paths):
  5.     # 读取图像(支持 8/16 位)
  6.     image = cv2.imread(file_path, cv2.IMREAD_UNCHANGED)
  7.    
  8.     # 确保图像为 16 位
  9.     if image.dtype == np.uint8:
  10.         image = image.astype(np.uint16)

  11.     image[image < 20000] = 20000
  12.     image[image > 60000] = 60000
  13.    
  14.     image_8u = ((image - 20000) / (60000 - 20000) * 255).astype(np.uint8)
  15.    
  16.     kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (31, 31))
  17.     image_bot_hat = cv2.morphologyEx(image_8u, cv2.MORPH_BLACKHAT, kernel)

  18.     _, small_regions = cv2.threshold(image_bot_hat, 87, 255, cv2.THRESH_BINARY)
  19.     num_labels, labels = cv2.connectedComponents(small_regions, connectivity=8)

  20.     selected_small_regions1 = np.zeros_like(labels)
  21.     for i in range(1, num_labels):
  22.         area = np.sum(labels == i)
  23.         if 5 <= area <= 200:
  24.             selected_small_regions1[labels == i] = 255
  25.    
  26.     selected_small_regions2 = np.zeros_like(labels)
  27.     for i in range(1, num_labels):
  28.         if np.any(selected_small_regions1 == 255):
  29.             mean_val = np.mean(image_8u[labels == i])
  30.             if 0 <= mean_val <= 30:
  31.                 selected_small_regions2[labels == i] = 255
  32.    
  33.     _,  big_regions = cv2.threshold(image_8u, 25, 255, cv2.THRESH_BINARY_INV)
  34.     num_labels_big, labels_big = cv2.connectedComponents(big_regions, connectivity=8)
  35.    
  36.     selected_big_regions = np.zeros_like(labels_big)
  37.     for i in range(1, num_labels_big):
  38.         area = np.sum(labels_big == i)
  39.         if 100 <= area <= 99999:
  40.             selected_big_regions[labels_big == i] = 255

  41.     result_regions = np.bitwise_or(selected_small_regions2, selected_big_regions)
  42.    
  43.     kernel_dilate = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
  44.     region_dilation = cv2.dilate(result_regions.astype(np.uint8), kernel_dilate, iterations=3)

  45.     region_dilation_bin = (region_dilation > 0).astype(np.uint8) * 255
  46.    
  47.     contours, _ = cv2.findContours(region_dilation_bin, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  48.    
  49.     cv2.drawContours(image_8u, contours, -1, 255, 1)
  50.    
  51.     result_file_path = file_path.replace('.png', '_result.png')
  52.    
  53.     cv2.imwrite(result_file_path, image_8u)

  54. print("处理完成")
复制代码



奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复 支持 3 反对 0

使用道具 举报

xah 发表于 2025-10-9 13:47:05 | 显示全部楼层
OPENCV HALCON双路高手!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 虎虎虎 发表于 2025-10-9 17:44:28 | 显示全部楼层
holybang 发表于 2025-10-7 21:01
对应Halcon代码如下:

OpenCV代码如下:

感谢大佬的代码和思路!牛哇!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 虎虎虎 发表于 2025-10-13 14:34:07 | 显示全部楼层
holybang 发表于 2025-10-7 21:01
对应Halcon代码如下:

OpenCV代码如下:

再请教一下大佬,这种异物与产品灰度差异不是那么大的该怎么处理,无法用之前图像一样的条件筛出来
20250422_153417_800.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
holybang 发表于 2025-10-15 21:03:17 | 显示全部楼层
虎虎虎 发表于 2025-10-13 14:34
再请教一下大佬,这种异物与产品灰度差异不是那么大的该怎么处理,无法用之前图像一样的条件筛出来
...

这个异物位于物体的边缘部分,过滤参数和中心部分的异物不同。所以我先确定了一个边缘的分区之后,再用一组新参数过滤这种异物。Halcon代码已按照这个逻辑更新,结果图也增加了一个。OpenCV的代码暂时没有改。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| 虎虎虎 发表于 2025-10-17 09:18:32 | 显示全部楼层
holybang 发表于 2025-10-15 21:03
这个异物位于物体的边缘部分,过滤参数和中心部分的异物不同。所以我先确定了一个边缘的分区之后,再用一 ...

感谢大佬的回复
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
holybang 发表于 2025-10-17 13:23:25 | 显示全部楼层

不客气,你看一下halcon代码的逻辑,照着实现一下opencv的代码应该也不难
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表