如何在不丢失信息的情况下将浮点数从 32 位转换为 8 位?
How to convert from float 32 to 8 bit without losing information?
我试图用 cv2.findContours
在我的图像中找到轮廓。因此,当它使用 CV_8UC1 图像时,我尝试在它成为 32 位之前用 dtype=np.uint8
转换我的数组。但是我在那里丢失了信息。还有其他办法吗?
第二个问题是边界框。信息保存在 rect
中,但未绘制在图片中。有谁知道为什么?
这是我的 picture/array 32 位:
这是我添加dtype=np.uint8
时的照片:
img_hr = np.array(b[1],dtype=np.uint8)
img_hr=img_hr*255
plt.imshow(img_hr)
hierachy, img_threshold = cv2.threshold(img_hr, 100, 255, cv2.THRESH_BINARY)
contours,_ = cv2.findContours(img_threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img_threshold, contours, -1, (0, 255, 0), 2, cv2.LINE_AA)
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img_threshold,[box],0,(0,0,255),2)
cv2.circle(img_threshold,(int(rect[0][0]),int(rect[0][1])),5,(255,0,0),-1)
plt.imshow(img_threshold)
希望您能理解我的问题。如果没有请问。我感谢您的帮助。谢谢
我自己找到了解决办法:
首先我使用32位图像在32位图像中找到带有cv2.threshold
的轮廓。在此之后,我将 32 位数组转换为 8 位 np.array(img_threshold_32bit,dtype=np.uint8)
而不会丢失任何轮廓。
所以现在 cv2.drawContours
的输入是一个 8 位数组。
但我仍然有问题,边界框没有画在图中。有什么想法吗?
代码如下:
img_hr = np.array(b[1])
hierachy, img_threshold_32bit = cv2.threshold(img_hr, 100, 255, cv2.THRESH_BINARY)
img_8bit = np.array(img_threshold_32bit,dtype=np.uint8)
contours,_ = cv2.findContours(img_8bit, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img_8bit, contours, -1, (0, 255, 0), 2, cv2.LINE_AA)
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img_8bit,[box],0,(0,0,255),2)
cv2.circle(img_8bit,(int(rect[0][0]),int(rect[0][1])),5,(255,0,0),-1)
plt.imshow(img_8bit)
因为你自己画
drawContours 仅绘制轮廓轮廓或填充轮廓。
您必须使用 boundingRec 或 minAreaRect 为每个轮廓找到一个矩形坐标,然后使用 opencv
的绘图函数绘制它
检查这个示例代码
https://github.com/birolkuyumcu/opencvbook_python/blob/master/Ders6/Ders6.py#L114
我试图用 cv2.findContours
在我的图像中找到轮廓。因此,当它使用 CV_8UC1 图像时,我尝试在它成为 32 位之前用 dtype=np.uint8
转换我的数组。但是我在那里丢失了信息。还有其他办法吗?
第二个问题是边界框。信息保存在 rect
中,但未绘制在图片中。有谁知道为什么?
这是我的 picture/array 32 位:
这是我添加dtype=np.uint8
时的照片:
img_hr = np.array(b[1],dtype=np.uint8)
img_hr=img_hr*255
plt.imshow(img_hr)
hierachy, img_threshold = cv2.threshold(img_hr, 100, 255, cv2.THRESH_BINARY)
contours,_ = cv2.findContours(img_threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img_threshold, contours, -1, (0, 255, 0), 2, cv2.LINE_AA)
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img_threshold,[box],0,(0,0,255),2)
cv2.circle(img_threshold,(int(rect[0][0]),int(rect[0][1])),5,(255,0,0),-1)
plt.imshow(img_threshold)
希望您能理解我的问题。如果没有请问。我感谢您的帮助。谢谢
我自己找到了解决办法:
首先我使用32位图像在32位图像中找到带有cv2.threshold
的轮廓。在此之后,我将 32 位数组转换为 8 位 np.array(img_threshold_32bit,dtype=np.uint8)
而不会丢失任何轮廓。
所以现在 cv2.drawContours
的输入是一个 8 位数组。
但我仍然有问题,边界框没有画在图中。有什么想法吗?
代码如下:
img_hr = np.array(b[1])
hierachy, img_threshold_32bit = cv2.threshold(img_hr, 100, 255, cv2.THRESH_BINARY)
img_8bit = np.array(img_threshold_32bit,dtype=np.uint8)
contours,_ = cv2.findContours(img_8bit, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img_8bit, contours, -1, (0, 255, 0), 2, cv2.LINE_AA)
for cnt in contours:
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(img_8bit,[box],0,(0,0,255),2)
cv2.circle(img_8bit,(int(rect[0][0]),int(rect[0][1])),5,(255,0,0),-1)
plt.imshow(img_8bit)
因为你自己画 drawContours 仅绘制轮廓轮廓或填充轮廓。 您必须使用 boundingRec 或 minAreaRect 为每个轮廓找到一个矩形坐标,然后使用 opencv
的绘图函数绘制它检查这个示例代码 https://github.com/birolkuyumcu/opencvbook_python/blob/master/Ders6/Ders6.py#L114