Pra*_*mar 6 python opencv image image-processing
我正在使用OpenCV和Python处理图像.我需要从图像中删除点/噪声.
我试过扩张使点变小,但是文字被损坏了.我也试过循环扩张两次并侵蚀一次.但这并没有给出令人满意的结果.
还有其他方法可以达到这个目的吗?
谢谢 :)
编辑:
我是图像处理的新手.我目前的代码如下
image = cv2.imread(file)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
kernel = np.ones((2, 2), np.uint8)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
gray = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
gray = cv2.erode(gray, kernel, iterations=1)
gray = cv2.dilate(gray, kernel, iterations=1)
cv2.imwrite(file.split('.'[0]+"_process.TIF", gray))
Run Code Online (Sandbox Code Playgroud)
编辑2:
我尝试了中位数模糊.它解决了90%的问题.我一直在使用gaussianBlurring.
谢谢
Dmi*_* Z. 11
如何使用删除小型连接组件 connectedComponentsWithStats
import cv2
import numpy as np
img = cv2.imread('path_to_your_image', 0)
_, blackAndWhite = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
nlabels, labels, stats, centroids = cv2.connectedComponentsWithStats(blackAndWhite, None, None, None, 8, cv2.CV_32S)
sizes = stats[1:, -1] #get CC_STAT_AREA component
img2 = np.zeros((labels.shape), np.uint8)
for i in range(0, nlabels - 1):
if sizes[i] >= 50: #filter small dotted regions
img2[labels == i + 1] = 255
res = cv2.bitwise_not(img2)
cv2.imwrite('res.png', res)
Run Code Online (Sandbox Code Playgroud)
这是c ++示例:
Mat invBinarized;
threshold(inputImage, invBinarized, 127, 255, THRESH_BINARY_INV);
Mat labels, stats, centroids;
auto nlabels = connectedComponentsWithStats(invBinarized, labels, stats, centroids, 8, CV_32S, CCL_WU);
Mat imageWithoutDots(inputImage.rows, inputImage.cols, CV_8UC1, Scalar(0));
for (int i = 1; i < nlabels; i++) {
if (stats.at<int>(i, 4) >= 50) {
for (int j = 0; j < imageWithoutDots.total(); j++) {
if (labels.at<int>(j) == i) {
imageWithoutDots.data[j] = 255;
}
}
}
}
cv::bitwise_not(imageWithoutDots, imageWithoutDots);
Run Code Online (Sandbox Code Playgroud)
编辑:
另见
connectedComponentsWithStats的OpenCV文档
归档时间: |
|
查看次数: |
2806 次 |
最近记录: |