【问题标题】:How can I preprocess following image more efficiently?如何更有效地预处理以下图像?
【发布时间】:2021-02-13 12:07:45
【问题描述】:

我正在尝试预处理布料的图像(例如下面

normal image)

并对其进行预处理,使其看起来像这样,以便轻松区分针迹和织物的其余部分(例如下面)

binarised image

我的最终目标是在这些预处理图像上训练一个模型来检测坏缝。

理想的预处理应该是

第 1 步:

initial image

第 2 步:

grayscale

第 3 步:

noise reduction

第四步:

final binarised image

目前,我正在使用可怕的 OpenCV 函数混搭来实现我在上面发布的结果;这很糟糕而且还不够好,因为我想创建一个实时系统。我想听听您对如何优化以下代码的见解

我没有足够的声誉来发布图片,这就是我发布超链接的原因:)

image = cv2.imread("C:/Users/name/Downloads/timepass/1.jpg")
image = cv2.resize(image, (800, 800))
thresh = 185
blur = cv2.bilateralFilter(image, 50, 175, 175)
blur = cv2.bilateralFilter(blur, 50, 175, 175)
im_bw = cv2.threshold(blur, thresh, 255, cv2.THRESH_BINARY)[1]
gray = cv2.cvtColor(im_bw, cv2.COLOR_BGR2GRAY)
final = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)[1]
cv2.imshow("bi", final)

【问题讨论】:

  • 如果你想训练一个模型(我假设你的意思是一个神经网络),那么这种预处理是没有必要的,因为神经网络会自己学习这些过滤器。
  • 如果您真的想使用定制设计的过滤器,您应该研究自适应阈值并在傅里叶空间中过滤某些图像频率以减少噪声而不是(或除此之外)模糊
  • 查看 cv2.inRange() 到给定颜色(或颜色范围)的阈值

标签: python opencv image-processing conv-neural-network opencv-python


【解决方案1】:

我建议您应用的第一个处理是转换为灰度。这样会缩短处理时间,让下面的函数只处理一个通道而不是三个。

对于去噪,双边滤波器的计算量很大,它的优点是可以平滑图像而不会丢失边缘信息。但是,我建议使用小内核的高斯滤波器或平均滤波器,以避免丢失太多信息。

在二值化中,您可以使用 OTSU 或自适应阈值,它们根据图像获得动态阈值。试试它们,看看它是如何工作的。 然后应用中值滤波器去除二值化图像中的脉冲噪声。在你使用形态学操作之后,我建议你使用对噪声去除特别有用的光圈。您还可以通过扩张来增加缝合线的大小。

我做了一个小程序,可以包含形态学运算和添加大津阈值。顾名思义,函数“remove_blobs_on_edges”会删除边缘上的那些斑点。程序如下:

import numpy as np
import cv2 
 
def remove_blobs_on_edges(image):
   
    """
        Eliminates blobs on edges

    """

    # use the binarized image as a mask for flood filling
    activation = np.array(image, dtype=np.uint8)
    
   
    mask_shape = (image.shape[0] + 2, image.shape[1] + 2)
    ffill_mask = np.zeros(mask_shape, dtype=np.uint8)
    # top and bottom rows
    for i in range(0, activation.shape[0]):
        for j in [0, activation.shape[1] - 1]:
            if activation[i,j]:
                cv2.floodFill(activation, ffill_mask, (j, i), 0)

    # left and right columns
    for i in [0, activation.shape[0] - 1]:
        for j in range(0, activation.shape[1]):
            if activation[i,j]:
                cv2.floodFill(activation, ffill_mask, (j, i), 0)
    

    return activation


image = cv2.imread('image2.png',0)
blured = cv2.blur(image,(3,3))
thresh = cv2.threshold(blured, 150, 255, cv2.THRESH_BINARY)[1]
thresh = remove_blobs_on_edges(thresh)

blured_mask = cv2.medianBlur(thresh,3)
before_after = np.hstack((thresh, blured_mask))

cv2.imshow("Result- Before/After",before_after)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多