我正在开发一个使用 OpenCV 进行图像预处理的项目。下面是我用于预处理图像的代码:
def preprocess_with_opencv(img):
img = img.numpy()
# Resize
img = cv2.resize(img, (img_width, img_height), interpolation=cv2.INTER_AREA)
# GaussianBlur
img = cv2.GaussianBlur(img, (3, 3), 0)
# Adaptive Threshold
img = cv2.adaptiveThreshold(
img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2
)
# Chuẩn hóa
img = img.astype("float32") / 255.0
img = np.expand_dims(img, axis=-1)
return img
预处理后,我使用以下函数对图像进行编码以进行进一步处理:
def encode_single_sample(img_path, label):
# 1. Đọc ảnh
img = tf.io.read_file(img_path)
# 2. Decode ảnh (grayscale)
img = tf.io.decode_png(img, channels=1)
# 3. Sử dụng OpenCV để xử lý trước
img = tf.py_function(preprocess_with_opencv, [img], Tout=tf.float32)
# 4. Transpose nếu mô hình yêu cầu
img = tf.transpose(img, perm=[1, 0, 2])
# 5. Trả về dictionary (image, label)
return {"image": img, "label": label}
原图是这样的:
但是,使用encode_single_sample函数处理图像后,数据似乎不正确,并且输出图像不清晰。如何解决这个问题并确保处理后的图像准确清晰?
可能与代码行有关
img = tf.transpose(img, perm=[1, 0, 2])
在encode_single_sample函数中。
我运行代码并使用 matplotlib 的 matshow() 函数检查输出,看起来图像是相同的,但旋转了 90 度。检查输入节点所需的矩阵顺序并相应地转置图像矩阵。