python-3.x - 试图将灰度图像转换为二进制,希望任何人都可以帮助我
问题描述
我有一个来自热像仪的文本文件,我用 opencv python 将它作为图像读取,它可以工作,然后我将它转换为灰度图像,它也可以工作!所以我可以看到图像中的人,问题是当我将其转换为二进制时,我得到一个空白的黑色图像,我需要在人的脸部周围绘制轮廓。所以我想知道可能是什么问题。提示:文本文件充满了温度值,当我阅读它时,它会查看整个人,然后我对文本文件进行阈值处理以使值介于 32.0 和 37.0 之间,以便我只显示面部区域并且它工作正常直到我尝试将其转换为二进制形式。提前致谢。
drive.google.com/file/d/1KgHmPAwcL_uPzVxwkigcQgCsY3jFjx8T/... #链接到文件
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
import os
text=np.loadtxt('1_thermal.txt') #the text file of the image
text[text < 32.0]=0 #threshholding to plot and save only the face
text[text > 37.0]=0
plt.imshow(text,cmap='jet')
plt.savefig('text.png', dpi=300, bbox_inches='tight')
plt.show()
person = cv.imread('text.png')
plt.imshow(cv.cvtColor(person, cv.COLOR_BGR2RGB))
cv.imwrite('person.jpg', person)
# get binary image and apply Gaussian blur
person_gray = cv.cvtColor(person, cv.COLOR_BGR2GRAY)
person_preprocessed = cv.GaussianBlur(person_gray, (5, 5), 0)
cv.imwrite('person-Gray.png', person_preprocessed)
plt.imshow(cv.cvtColor(person_preprocessed, cv.COLOR_GRAY2RGB))
解决方案
您可以像这样将图像加载到 Numpy 数组中:
import numpy as np
# Load image
im = np.loadtxt('thermal.txt')
如果我们检查im.dtype
和im.shape
,它们是:
float64, (288, 382)
现在你想要一个二值图像。我想你的意思是它只会有真/假的值,所以我们需要一个阈值。由于人脸是 32 以上的一切,我们将使用 32 作为阈值:
# Threshold - greater than 32 becomes True, all else becomes False
binary = im > 32
binary
现在将在面部所在的位置为 True,在其他位置为 False,但我想您想要一个图像在背景所在的位置为黑色 (0),在其他位置为白色 (255)。所以你要:
# Convert from False/True, to 0/255 and save
binary = (binary*255).astype(np.uint8)
cv2.imwrite('result.png', binary)
这给出了:
推荐阅读
- javascript - 是什么决定了这些组件的“挂载”功能的执行顺序?
- sql - SQL Server 按外键分组并选择依赖列
- sql - 雪花程序错误(将数据放入 blob 存储)
- android - 在 kotlin 中使用共享首选项保存变量的最简单方法是什么?
- pytest - py.test:如何避免命名每个测试?动态生成测试名称
- c# - 小于运算符与 Math.Abs() 检查负值
- swift - 错误:传递给不带参数 SwiftUI 的调用的参数
- html - 将绝对设置为 td 中的 div
- sql - 从连接表中获取 Max
- windbg - windbg StopOnException 的“伪寄存器号”参数有什么作用?