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
Python 将OpenCV图像转换为黑白图像_Python_Image Processing_Opencv_Computer Vision - Fatal编程技术网

Python 将OpenCV图像转换为黑白图像

Python 将OpenCV图像转换为黑白图像,python,image-processing,opencv,computer-vision,Python,Image Processing,Opencv,Computer Vision,如何将灰度OpenCV图像转换为黑白?我看到已经有人问了一个问题,但我使用的是OpenCV 2.3,而建议的解决方案似乎不再有效 我正在尝试将灰度图像转换为黑白,这样任何不是绝对黑色的东西都是白色的,并将其用作的遮罩,以便忽略在黑色遮罩区域边缘发现的关键点 下面的Python让我几乎达到了目的,但是发送到threshold()的阈值似乎没有任何效果。如果我将其设置为0、16、128或255,结果是相同的,值大于128的所有像素都变为白色,其他所有像素都变为黑色 我做错了什么 import cv,

如何将灰度OpenCV图像转换为黑白?我看到已经有人问了一个问题,但我使用的是OpenCV 2.3,而建议的解决方案似乎不再有效

我正在尝试将灰度图像转换为黑白,这样任何不是绝对黑色的东西都是白色的,并将其用作的遮罩,以便忽略在黑色遮罩区域边缘发现的关键点

下面的Python让我几乎达到了目的,但是发送到threshold()的阈值似乎没有任何效果。如果我将其设置为0、16、128或255,结果是相同的,值大于128的所有像素都变为白色,其他所有像素都变为黑色

我做错了什么

import cv, cv2
fn = 'myfile.jpg'
im_gray = cv2.imread(fn, cv.CV_LOAD_IMAGE_GRAYSCALE)
im_gray_mat = cv.fromarray(im_gray)
im_bw = cv.CreateImage(cv.GetSize(im_gray_mat), cv.IPL_DEPTH_8U, 1);
im_bw_mat = cv.GetMat(im_bw)
threshold = 0 # 128#255# HAS NO EFFECT!?!?
cv.Threshold(im_gray_mat, im_bw_mat, threshold, 255, cv.CV_THRESH_BINARY | cv.CV_THRESH_OTSU);
cv2.imshow('', np.asarray(im_bw_mat))
cv2.waitKey()

指定
CV\u THRESH\u OTSU
会导致忽略阈值。发件人:

此外,特殊值THRESH_OTSU可与上述值之一组合。在这种情况下,函数使用大津算法确定最佳阈值,并使用它代替指定的阈值。该函数返回计算出的阈值。目前,大津的方法仅用于8位图像

该代码从相机读取帧,并在值20处执行二进制阈值

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main(int argc, const char * argv[]) {

    VideoCapture cap; 
    if(argc > 1) 
        cap.open(string(argv[1])); 
    else 
        cap.open(0); 
    Mat frame; 
    namedWindow("video", 1); 
    for(;;) {
        cap >> frame; 
        if(!frame.data) 
            break; 
        cvtColor(frame, frame, CV_BGR2GRAY);
        threshold(frame, frame, 20, 255, THRESH_BINARY);
        imshow("video", frame); 
        if(waitKey(30) >= 0) 
            break;
    }

    return 0;
}

使用新的cv2 Python绑定,逐步回答与您提到的答案类似的问题:

1。读取灰度图像

import cv2
im_gray = cv2.imread('grayscale_image.png', cv2.IMREAD_GRAYSCALE)
2。将灰度图像转换为二进制图像

(thresh, im_bw) = cv2.threshold(im_gray, 128, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
它使用大津的方法从图像自动确定阈值,或者如果您已经知道可以使用的阈值:

thresh = 127
im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]
3。保存到磁盘

cv2.imwrite('bw_image.png', im_bw)

请注意,如果使用
cv.cv\u THRESH\u BINARY
表示大于阈值的每个像素都将成为最大值(在您的示例中为255),否则该值为0。显然,如果阈值为0,则所有内容都变为白色(maxValue=255),如果值为255,则所有内容都变为黑色(即0)

如果你不想计算出一个阈值,你可以使用大津的方法。但在OpenCV的实现中,该算法仅适用于8位图像。如果图像为8比特,请使用如下算法:

cv.Threshold(im_gray_mat,im_bw_mat,Threshold,255,cv.cv_THRESH_BINARY | cv.cv_THRESH_OTSU)


无论阈值的值是多少,如果您有一个8位图像。

只需编写以下代码片段即可将OpenCV图像转换为灰度图像

import cv2
image = cv2.imread('image.jpg',0)
cv2.imshow('grey scale image',image)
请注意image.jpg和代码必须保存在同一文件夹中

请注意:

  • ('image.jpg')
    提供RGB图像
  • ('image.jpg',0)
    给出灰度图像
方法1 在将灰度图像转换为二值图像时,我们通常使用
cv2.threshold()
并手动设置阈值。有时为了得到一个好的结果,我们选择了大津的二值化

我在读一些博客文章时遇到了一个小问题

  • 将彩色(RGB)图像转换为灰度
  • 获取灰度图像的中值
  • 选择高于中值33%的阈值
  • 为什么是33%? 这是因为33%适用于大多数图像/数据集

    您也可以通过将
    中值
    替换为
    均值
    来计算相同的方法

    方法2 另一种方法是从正或负的平均值中取标准偏差(
    std
    )的
    x
    ;设定一个门槛。因此,它可能是以下之一:

    • th1=平均值-(x*std)
    • th2=平均值+(x*std)

    注意:在应用阈值之前,建议在局部增强灰度图像的对比度(请参见)。

    这是我在网上找到的两行代码,可能对初学者有帮助

    # Absolute value of the 32/64
    abs_image_in32_64 = np.absolute(image_in32_64)
    
    image_8U = np.uint8(abs_image_in32_64)
    

    对于那些做视频的人,我基于@tsh拼凑了以下内容:

    import cv2 as cv
    import numpy as np
    
    def nothing(x):pass
    
    cap = cv.VideoCapture(0)
    cv.namedWindow('videoUI', cv.WINDOW_NORMAL)
    cv.createTrackbar('T','videoUI',0,255,nothing)
    
    while(True):
        ret, frame = cap.read()
        vid_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        thresh = cv.getTrackbarPos('T','videoUI');
        vid_bw = cv.threshold(vid_gray, thresh, 255, cv.THRESH_BINARY)[1]
    
        cv.imshow('videoUI',cv.flip(vid_bw,1))
    
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    
    cap.release()
    cv.destroyAllWindows()
    
    结果:


    注意:至少在OpenCV 3.1(或更早版本)中,
    cv2.CV\u LOAD\u IMAGE\u GRAYSCALE
    现在是
    cv2.IMREAD\u GRAYSCALE
    。除此之外,该代码在使用Python 3.5时运行良好。这可能超出了问题的范围,但如果自动选择阈值,请您解释一下2中第一个代码中128的值意味着什么?该值没有什么特别之处,因为正如您所说,阈值是自动选择的。该值被忽略。查看如何使用cv2将获得的二进制图像转换为灰度图像?能否显示代码片段以(2)获得灰度图像的中值?@Wewer Yu可以这样使用
    numpy
    中提供的函数:
    np.median(gray_image)
    感谢分享(2)。灰度不是黑白的!