Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 如何在同一图像中增白背景和blaken网格_Opencv_Image Processing - Fatal编程技术网

Opencv 如何在同一图像中增白背景和blaken网格

Opencv 如何在同一图像中增白背景和blaken网格,opencv,image-processing,Opencv,Image Processing,我有一个这样的形象。我想使用HoughLine检测,但图像太暗,无法识别线条。有没有一种方法可以使背景变白,网格变黑?在openCV或python中是否有我可以应用的算法?多谢各位 您的图像对比度差,光线不一致。你必须在这里做一些预处理C++代码:< /P> cv::Mat img = cv::imread("E:\\Workspace\\KS\\excercise\\oBwBH.jpg", 0); cv::Mat workingMat; cv::GaussianBlur(img, workin

我有一个这样的形象。我想使用HoughLine检测,但图像太暗,无法识别线条。有没有一种方法可以使背景变白,网格变黑?在openCV或python中是否有我可以应用的算法?多谢各位


您的图像对比度差,光线不一致。你必须在这里做一些预处理C++代码:< /P>
cv::Mat img = cv::imread("E:\\Workspace\\KS\\excercise\\oBwBH.jpg", 0);
cv::Mat workingMat;
cv::GaussianBlur(img, workingMat, cv::Size(101, 101), 31, 31); //high blur to extract background light
img = img - 0.7*work; //adjust light level
cv::normalize(img, img, 0, 255, cv::NORM_MINMAX); \\use whole range
cv::medianBlur(img, img, 5); \\remove noise
cv::Canny(img, work, 100, 200); \\extract lines; you could do hough lines instead since it has canny inside.
结果从左到右,canny有所有行,在预览中存在一些压缩问题:
您的图像对比度差,光线不一致。你必须在这里做一些预处理C++代码:< /P>
cv::Mat img = cv::imread("E:\\Workspace\\KS\\excercise\\oBwBH.jpg", 0);
cv::Mat workingMat;
cv::GaussianBlur(img, workingMat, cv::Size(101, 101), 31, 31); //high blur to extract background light
img = img - 0.7*work; //adjust light level
cv::normalize(img, img, 0, 255, cv::NORM_MINMAX); \\use whole range
cv::medianBlur(img, img, 5); \\remove noise
cv::Canny(img, work, 100, 200); \\extract lines; you could do hough lines instead since it has canny inside.
结果从左到右,canny有所有行,在预览中存在一些压缩问题:

您应该尝试一种形式的局部自适应阈值。 在OpenCV中,这称为cv2.adaptiveThreshold

请参见此处:获取python示例

上述源代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('sudoku.png',0)
img = cv2.medianBlur(img,5)
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
            cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv2.THRESH_BINARY,11,2)
titles = ['Original Image', 'Global Thresholding (v = 127)',
            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

您应该尝试一种形式的局部自适应阈值。 在OpenCV中,这称为cv2.adaptiveThreshold

请参见此处:获取python示例

上述源代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('sudoku.png',0)
img = cv2.medianBlur(img,5)
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
            cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv2.THRESH_BINARY,11,2)
titles = ['Original Image', 'Global Thresholding (v = 127)',
            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

我试着先放大图像,然后中间模糊它,这样我就得到了背景。使用原始的灰色图像来细分背景,我得到的是网格。然后做一些其他的步骤,我得到这样的结果

代码如下:

#!/usr/bin/python3
# 2017.10.04 19:37:43 CST

filename = "data/paper.png"
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## do morph-dilate-op
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
dilated = cv2.morphologyEx(gray, cv2.MORPH_DILATE, kernel)
diff1 = 255 - cv2.subtract(dilated, gray)

## do medianBlur
median = cv2.medianBlur(dilated, 15)
diff2 = 255 - cv2.subtract(median, gray)

## do normalize 
normed = cv2.normalize(diff2,None, 0, 255, cv2.NORM_MINMAX )

## save the result 
dst = np.hstack((gray, normed))
cv2.imwrite("result_paper1.png", dst)
res = np.hstack((gray,dilated, diff1,  median, diff2, normed))
cv2.imwrite("result_paper2.png", res)

我试着先放大图像,然后中间模糊它,这样我就得到了背景。使用原始的灰色图像来细分背景,我得到的是网格。然后做一些其他的步骤,我得到这样的结果

代码如下:

#!/usr/bin/python3
# 2017.10.04 19:37:43 CST

filename = "data/paper.png"
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## do morph-dilate-op
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))
dilated = cv2.morphologyEx(gray, cv2.MORPH_DILATE, kernel)
diff1 = 255 - cv2.subtract(dilated, gray)

## do medianBlur
median = cv2.medianBlur(dilated, 15)
diff2 = 255 - cv2.subtract(median, gray)

## do normalize 
normed = cv2.normalize(diff2,None, 0, 255, cv2.NORM_MINMAX )

## save the result 
dst = np.hstack((gray, normed))
cv2.imwrite("result_paper1.png", dst)
res = np.hstack((gray,dilated, diff1,  median, diff2, normed))
cv2.imwrite("result_paper2.png", res)

你有密码吗?你试过什么了吗?如果是,你试过什么?请详细说明您的问题。您已经得到了一些答案,但为了清楚起见,Hough寻找白线,所以您实际上希望在最后有一个黑色背景和白线。噢,非常感谢。有没有办法把这张照片变成完美的黑底白线?或者有检测黑线的算法吗?你们有代码吗?你试过什么了吗?如果是,你试过什么?请详细说明您的问题。您已经得到了一些答案,但为了清楚起见,Hough寻找白线,所以您实际上希望在最后有一个黑色背景和白线。噢,非常感谢。有没有办法把这张照片变成完美的黑底白线?或任何检测黑线的算法?Opencv支持自适应阈值:Opencv hough线在阈值图像上的性能通常较差许多误报。这就是我建议对比度增加方法的原因。全局增加对比度不应改变Hough变换中最大值的位置。我不确定它在OpenCV内部是如何工作的,但我相信如果您首先应用局部阈值,您将获得更好的结果。OpenCV支持自适应阈值:OpenCV hough线通常在阈值图像上执行得更差许多误报。这就是我建议对比度增加方法的原因。全局增加对比度不应改变Hough变换中最大值的位置。我不确定它在OpenCV内部是如何工作的,但我相信如果您首先应用本地化阈值,您将获得更好的结果。