天天看点

opencv 去除噪点 java_c++ - OpenCV-去除图像中的噪点 - 堆栈内存溢出

我在OpenCV中尝试了一些过滤器/操作,它似乎工作得很好。

第1步: 放大图片-

kernel = np.ones((5, 5), np.uint8)

cv2.dilate(img, kernel, iterations = 1)

opencv 去除噪点 java_c++ - OpenCV-去除图像中的噪点 - 堆栈内存溢出

如您所见,噪点消失了,但字符很轻,所以我腐蚀了图像。

第2步: 侵蚀图像-

kernel = np.ones((5, 5), np.uint8)

cv2.erode(img, kernel, iterations = 1)

opencv 去除噪点 java_c++ - OpenCV-去除图像中的噪点 - 堆栈内存溢出

如您所见,噪音消失了,但是其他列上的某些字符损坏了。 我建议仅在嘈杂的列上运行这些操作。 您可能要使用HoughLines查找最后一列。 然后,您只能提取该列,进行扩散+腐蚀,然后将其替换为原始图像中的相应列。 另外,膨胀+侵蚀实际上是一个称为close的操作。 您可以直接使用-

cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

正如@Ermlg所建议的,具有3内核的midBlur也可以很好地工作。

cv2.medianBlur(img, 3)

opencv 去除噪点 java_c++ - OpenCV-去除图像中的噪点 - 堆栈内存溢出

替代步骤

如您所见,所有这些滤波器都起作用,但是最好仅在有噪声的部分实现这些滤波器。 为此,请使用以下命令:

edges = cv2.Canny(img, 50, 150, apertureSize = 3) // img is gray here

lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, 1000, 50) // last two arguments are minimum line length and max gap between two lines respectively.

for line in lines:

for x1, y1, x2, y2 in line:

print x1, y1

// This gives the start coordinates for all the lines. You should take the x value which is between (0.75 * w, w) where w is the width of the entire image. This will give you essentially **(x1, y1) = (1896, 766)**

然后,您只能像这样提取该部分:

extract = img[y1:h, x1:w] // w, h are width and height of the image

opencv 去除噪点 java_c++ - OpenCV-去除图像中的噪点 - 堆栈内存溢出

然后,在此图像中实现过滤器(中位或关闭)。 消除噪点后,您需要将此滤波后的图像替换为原始图像中的模糊部分。 image [y1:h,x1:w] =中位数

这在C ++中很简单:

extract.copyTo(img, new Rect(x1, y1, w - x1, h - y1))

替代方法的最终结果

opencv 去除噪点 java_c++ - OpenCV-去除图像中的噪点 - 堆栈内存溢出

希望能帮助到你!