1. 图片素材
下图是一张RGB彩色图片,黑色区域是背景,红色区域是我们感兴趣的区域。
2. 目标任务
获取感兴趣区域的灰度值(需要查看任意位置的灰度值,以确定二值化的阈值取值)
图像二值化
3. 实现过程
代码实现了可以查看图片任意点的灰度值,方便我们确定阈值。具代码来自于博主
ShawDa
链接:http://t.csdn.cn/s1VEyhttp://t.csdn.cn/s1VEy
import cv2
img = cv2.imread('E:/img/red.png')
gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
def mouse_click(event, x, y, flags, para):
if event == cv2.EVENT_LBUTTONDOWN: # 左边鼠标点击
print('PIX:', x, y)
print("RGB:", img[y, x])
print("GRAY:", gray[y, x])
print("HSV:", hsv[y, x])
if __name__ == '__main__':
cv2.namedWindow("img")
cv2.setMouseCallback("img", mouse_click)
while True:
cv2.imshow('img', img)
if cv2.waitKey() == ord('q'):
break
cv2.destroyAllWindows()
结果是:红色区域的灰度值在15左右,黑色区域的灰度值均为0。
接着我写了一段二值化的代码:
img = cv2.imread('E:/img/red.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
_,img_binary = cv2.threshold(img_gray, 1, 255, cv2.THRESH_BINARY)
print(img.shape)
print(img_gray.shape)
cv2.imshow('binary', img_binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('E:/img/crack_binary.png',img_binary)
效果如下:
4. 代码解读
首先,我导入了cv2、numpy库。然后,使用cv2.imread函数读取了名为’red.png’的图片,并将其存储在img变量中。 接下来,使用cv2.cvtColor函数将彩色图片转换为灰度图像,存储在img_gray变量中。 之后,使用cv2.threshold函数对灰度图像进行二值化处理,将灰度值小于1的像素设为0,大于等于1的像素设为255,并将结果存储在img_binary变量中。 最后,打印了img和img_gray的形状,并使用cv2.imshow函数显示了二值化后的图像,完成了写入和保存。
值得注意的是:
在这段代码中,"_,img_binary" 使用了一个下划线"_"来接收函数返回的不需要的值。在Python中,下划线通常用于表示一个临时变量,表明该变量不会被使用。如果去掉下划线,将会把函数返回值直接赋值给变量img_binary。
而根据OpenCV的文档,cv2.threshold函数返回两个值:一个是阈值处理后的图像(即img_binary),另一个是阈值(即阈值1)。当只关心其中一个值而不需要另一个值时,可以使用下划线来忽略不需要的值。
因此,如果去掉下划线后,img_binary的类型变得不正确。需要确保img_binary的类型是一个有效的图像数据类型,以便正确地传递给cv2.imshow函数。
不要问我怎么知道的,,,