【问题标题】:How do I enhance an image then convert it to a binary image using Python and OpenCV?如何增强图像然后使用 Python 和 OpenCV 将其转换为二进制图像?
【发布时间】:2014-07-23 23:43:43
【问题描述】:

我创建了一个简单的示例来说明我正在尝试做的事情:

#!/usr/bin/python

#---------------------------------------------------------------------
# imports
#    >>> cv2.__version__
#    '2.4.6.1'
#    >>> scipy.__version__
#    '0.12.0'
#---------------------------------------------------------------------
import cv2
from scipy.signal import wiener

#---------------------------------------------------------------------
# functions
#---------------------------------------------------------------------
def enhance_image(input_image):
    my_im = input_image.copy()
    my_im = wiener(my_im)
    return my_im

#---------------------------------------------------------------------
# Main
#---------------------------------------------------------------------
filename="./data/5b2013d0-7939-48a6-94eb-045495b85343.png"

im=cv2.imread(filename)
cv2.imshow('Original',im)

gray_im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray',gray_im)

enhanced_im=enhance_image(gray_im)
cv2.imshow('Enhanced',enhanced_im)

# this fails
(thresh, bw_im) = cv2.threshold(enhanced_im, 128, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
cv2.imshow('Black and White',bw_im)

key = cv2.waitKey()

代码加载图像,将其转换为灰度,使用scipy.signal 模块运行维纳算法来增强图像,之后我想将图像转换为二进制图像(黑白)。当我运行上面的代码时,出现以下错误:

OpenCV 错误:阈值中的断言失败 (src.type() == CV_8UC1),文件 /home/mrichey/Downloads/opencv2.4/opencv-2.4.6.1/modules/imgproc/src/thresh.cpp,行719 回溯(最近一次通话最后): 文件“./simple_example.py”,第 37 行,在 (thresh, bw_im) = cv2.threshold(enhanced_im, 128, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) cv2.error:/home/mrichey/Downloads/opencv2.4/opencv->2.4.6.1/modules/imgproc/src/thresh.cpp:719:错误:(-215)src.type()==函数中的CV_8UC1阈值

我对此错误的研究使我相信传递给threshold 函数的图像类型错误,但我不知道它需要转换成什么或如何进行转换。

当我将gray_im 传递给threshold 时,它可以正常工作。我注意到gray_im 全是整数,但enhanced_im 有浮点值,所以我尝试将enhance_image 函数修改为:

def enhance_image(input_image):
    my_im = input_image.copy()
    my_im = wiener(my_im)
    return my_im.astype(int)

但是,我遇到了同样的错误。

【问题讨论】:

  • my_im.astype(np.uint8)
  • 谢谢这也有效。我在下面测试了这个和 Ryan 的答案。

标签: python opencv image-processing computer-vision signal-processing


【解决方案1】:

enhanced_im 转换为threshold 的适当类型将使其工作。这可以通过以下方式完成:

enhanced_im  = numpy.array(enhanced_im, numpy.uint8)

这是你的代码,修改后可以工作:

import cv2
from scipy.signal import wiener
import numpy
#---------------------------------------------------------------------
# functions
#---------------------------------------------------------------------
def enhance_image(input_image):
    my_im = input_image.copy()
    my_im = wiener(my_im)
    return my_im

#---------------------------------------------------------------------
# Main
#---------------------------------------------------------------------
filename="/home/ryan/OpenCV/opencv-2.3.4.7/samples/cpp/baboon.jpg"

im=cv2.imread(filename)
cv2.imshow('Original',im)

gray_im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray',gray_im)

enhanced_im=enhance_image(gray_im)
cv2.imshow('Enhanced',enhanced_im)
#print type(enhanced_im)
#enhanced_im.astype(numpy.uint8)
enhanced_im  = numpy.array(enhanced_im, numpy.uint8)
#print enhanced_im
# this fails
#ret,thresh = cv2.threshold(imgray,self.t1,225, cv2.THRESH_BINARY)
thresh, bw_im = cv2.threshold(enhanced_im, 128, 255, cv2.THRESH_BINARY)
cv2.imshow('Black and White',bw_im)

key = cv2.waitKey()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-14
    • 2014-11-12
    • 2011-02-28
    • 1970-01-01
    • 2012-05-26
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多