如何用Python和OpenCV增强图像并转换为二值图像?

2 投票
1 回答
3452 浏览
提问于 2025-04-18 08:25

我创建了一个简单的例子,想要实现的功能如下:

#!/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) 在 threshold 函数中,文件路径 /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 中

我对这个错误的研究让我相信,传递给 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)

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

1 个回答

3

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()

撰写回答