当我阈值图像时,我得到一个完全黑色的图像

时间:2017-07-16 20:53:35

标签: python-2.7 opencv

Wave image

我试图对波浪进行阈值处理,使白色背景显示为黑色,而原本黑色的波浪本身就是白色,但它似乎只会返回一个完全黑色的图像。我究竟做错了什么?

import cv2 
src = cv2.imread("C:\\Users\\ksatt\\Desktop\\SoundByte\\blackwaveblackaxis (1).PNG",0)

maxValue = 255
thresh= 53

if not src is None:
    th, dst = cv2.threshold(src, thresh, maxValue, cv2.THRESH_BINARY_INV)
    cv2.imshow("blackwave.PNG", dst)
    cv2.imwrite("blackwave.PNG", dst)
    cv2.waitKey(0) 
else:
    print 'Image could not be read'

3 个答案:

答案 0 :(得分:0)

如果你看一下http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#threshold,它会告诉你每个参数对函数的作用。

这里还有一个很好的教程:

http://docs.opencv.org/trunk/d7/d4d/tutorial_py_thresholding.html

  

Python:cv.Threshold(src,dst,threshold,maxValue,thresholdType)→   没有   原型是否在上述API中得到进一步的扩展。

只需将代码更改为:

cv2.threshold(src,RESULT, thresh, maxValue, cv2.THRESH_BINARY_INV)
cv2.imshow("blackwave.PNG", RESULT)

答案 1 :(得分:0)

你的门槛太低了,黑纸会拿起你不想要的值。基本上,图像的对比度太低。

一个简单的解决方案是减去背景。执行此操作的简单方法是dilate()灰度图像,这将扩大白色区域并超越黑色线条。然后,您可以将小GaussianBlur()应用于扩散的图像,这将为您提供一个“背景”图像,您可以从原始图像中减去该图像以获得清晰的线条视图。从那里你可以得到更好的threshold()图像,你甚至可以使用OTSU阈值来自动为你设置阈值水平。

import cv2 
import numpy as np

# read image
src = cv2.imread('wave.png',0)

Image

# create background image
bg = cv2.dilate(src, np.ones((5,5), dtype=np.uint8))
bg = cv2.GaussianBlur(bg, (5,5), 1)

Background image

# subtract out background from source
src_no_bg = 255 - cv2.absdiff(src, bg)

Subtracted background

# threshold
maxValue = 255
thresh = 240
retval, dst = cv2.threshold(src_no_bg, thresh, maxValue, cv2.THRESH_BINARY_INV)

Manual threshold

# automatic / OTSU threshold
retval, dst = cv2.threshold(src_no_bg, 0, maxValue, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

OTSU thresholding

您可以看到手动阈值处理提供与OTSU相同的结果,但您不必使用OTSU的值,它会为您找到它们。这并不总是最好的方式,但有时可以很快。有关不同阈值操作的更多信息,请查看this tutorial

答案 2 :(得分:-1)

你能发一张波浪的照片吗?你尝试过使用标准的python吗?这样的事情应该有效:

import numpy as np
import matplotlib.pyplot as plt

maxValue = 255
thresh= 53

A = np.load('file.png')
# For each pixel, see if it's above/below the threshold
for i in range(A.shape[0]):      # Loop along the X direction
    for j in range(A.shape[1]):   # Loop along the Y direction
        # Set to black the background
        if A[i,j] > thresh:
            A[i,j] = 0
        if A[i,j] == 0:
            A[i,j] = 255

或类似的东西。