如何在不丢失信息的情况下将浮点数从 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