使用OpenCV/PIL读取验证码图像时像素值全为零的问题求助
问题解决方案
1. 问题根源
你遇到的这类验证码属于透明通道存储有效信息的类型:实际验证码的像素值保存在Alpha(透明度)通道中,而RGB通道被设置为全黑(像素值0),所以直接读取RGB通道会得到全0的结果,但PIL显示时会自动结合Alpha通道和背景,所以看起来正常。
2. 验证通道信息
用PIL查看通道详情
from PIL import Image import numpy as np img = Image.open("uQqXw.png") print(img.mode) # 输出应为"RGBA",说明包含Alpha通道 # 拆分通道查看 r, g, b, a = img.split() # 打印Alpha通道的像素数组 print(np.array(a)) # 这里会显示验证码的有效像素值
用OpenCV查看通道详情
import cv2 import numpy as np # 必须加IMREAD_UNCHANGED参数,否则会忽略Alpha通道 img = cv2.imread("uQqXw.png", cv2.IMREAD_UNCHANGED) print(img.shape) # 输出应为(h, w, 4),代表4通道RGBA图像 # 提取Alpha通道 alpha_channel = img[:, :, 3] print(alpha_channel) # 这里会显示验证码的有效像素值
3. 提取有效图像
直接提取Alpha通道作为单通道图像即可获取有效像素:
PIL处理方式
from PIL import Image import numpy as np img = Image.open("uQqXw.png") # 提取Alpha通道 alpha_channel = img.split()[3] # 转换为数组(此时像素值正常) alpha_array = np.array(alpha_channel) # 显示或保存 alpha_channel.show()
OpenCV处理方式
import cv2 import numpy as np img = cv2.imread("uQqXw.png", cv2.IMREAD_UNCHANGED) alpha_channel = img[:, :, 3] # 显示验证码 cv2.imshow("Captcha", alpha_channel) cv2.waitKey(0) cv2.destroyAllWindows() # 此时alpha_channel数组即为有效像素值
内容的提问来源于stack exchange,提问作者Saurabh Yadav
相关产品推荐
相关产品推荐

