use*_*339 55 python opencv image-processing
我正在学习使用OpenCV进行实时应用程序的图像处理.我对图像进行了一些阈值处理,并希望将轮廓标记为绿色,但它们不会显示为绿色,因为我的图像是黑白的.
在程序的早期我使用了gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)从RGB转换为灰度,但要回去我很困惑,函数backtorgb = cv2.cvtColor(gray,cv2.CV_GRAY2RGB)给出了AttributeError:'module'对象没有属性'CV_GRAY2RGB'.
下面的代码似乎没有以绿色绘制轮廓 - 这是因为它是灰度图像吗?如果是这样,我可以将灰度图像转换回RGB以使绿色轮廓可视化吗?
import numpy as np
import cv2
import time
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
ret, frame = cap.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
ret, gb = cv2.threshold(gray,128,255,cv2.THRESH_BINARY)
gb = cv2.bitwise_not(gb)
contour,hier = cv2.findContours(gb,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contour:
cv2.drawContours(gb,[cnt],0,255,-1)
gray = cv2.bitwise_not(gb)
cv2.drawContours(gray,contour,-1,(0,255,0),3)
cv2.imshow('test', gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
Ano*_*bhu 96
我正在推广我的评论答案:
简单的方法是:
您可以使用原始"框架"本身而不是使用灰色图像.
困难的方法(你试图实施的方法):
backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)
是正确的语法.
nat*_*ncy 13
或者,cv2.merge()
可用于通过将与新图像的蓝色、绿色和红色图层相同的图层合并在一起,将单通道二值蒙版图层转换为三通道彩色图像。我们传入三个颜色通道层的列表——在本例中都是相同的——函数返回带有这些颜色通道的单个图像。这有效地将形状的灰度图像(height, width, 1)
转换为(height, width, 3)
解决您的问题
我对图像做了一些阈值处理,想用绿色标记轮廓,但它们没有显示为绿色,因为我的图像是黑白的。
这是因为您试图在单个通道图像上显示三个通道。要解决此问题,您可以简单地合并三个单通道
image = cv2.imread('image.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray_three = cv2.merge([gray,gray,gray])
Run Code Online (Sandbox Code Playgroud)
例子
我们创建具有尺寸的彩色图像 (200,200,3)
image = (np.random.standard_normal([200,200,3]) * 255).astype(np.uint8)
Run Code Online (Sandbox Code Playgroud)
接下来我们将其转换为灰度并使用cv2.merge()
三个灰度通道创建另一个图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray_three = cv2.merge([gray,gray,gray])
Run Code Online (Sandbox Code Playgroud)
我们现在在具有形状的单通道灰度图像(左)和具有形状(200,200,1)
的三通道灰度图像(200,200,3)
(右)上绘制填充轮廓。左图展示了您遇到的问题,因为您试图在单个通道图像上显示三个通道。将灰度图像合并为三个通道后,我们现在可以将颜色应用到图像上
contour = np.array([[10,10], [190, 10], [190, 80], [10, 80]])
cv2.fillPoly(gray, [contour], [36,255,12])
cv2.fillPoly(gray_three, [contour], [36,255,12])
Run Code Online (Sandbox Code Playgroud)
完整代码
import cv2
import numpy as np
# Create random color image
image = (np.random.standard_normal([200,200,3]) * 255).astype(np.uint8)
# Convert to grayscale (1 channel)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Merge channels to create color image (3 channels)
gray_three = cv2.merge([gray,gray,gray])
# Fill a contour on both the single channel and three channel image
contour = np.array([[10,10], [190, 10], [190, 80], [10, 80]])
cv2.fillPoly(gray, [contour], [36,255,12])
cv2.fillPoly(gray_three, [contour], [36,255,12])
cv2.imshow('image', image)
cv2.imshow('gray', gray)
cv2.imshow('gray_three', gray_three)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)
小智 8
试试这个:
import cv2
import cv
color_img = cv2.cvtColor(gray_img, cv.CV_GRAY2RGB)
Run Code Online (Sandbox Code Playgroud)
我发现,在使用opencv时,某些常量是在cv2模块中定义的,而其他常量则在cv模块中定义.
一旦你将你的图像转换为灰度,你就无法回来.你已经从三个频道变为一个,当你试图回去时,所有三个数字将是相同的.所以简短的回答是不,你不能回去.你的backtorgb函数抛出该错误的原因是因为它需要采用以下格式:
CvtColor(input, output, CV_GRAY2BGR)
Run Code Online (Sandbox Code Playgroud)
OpenCV使用BGR而不是RGB,所以如果你修改它的顺序它应该工作,虽然你的图像仍然是灰色的.
归档时间: |
|
查看次数: |
158999 次 |
最近记录: |