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