如何使用Python提升图像黑白清晰度以优化整体图像质量
问题分析
你当前的代码存在3个核心问题导致黑白分割效果不佳:
convert("LA")得到的每个像素是(亮度值, 透明度)二元组,直接和三元组的固定阈值比较逻辑不成立- 全局固定阈值138无法适配图像的局部光照差异,容易出现暗部糊成一团、亮部细节丢失的问题
- 没有前置降噪、对比度增强处理,二值化后边缘容易出现锯齿噪点
优化方案
方案1:修复原有逻辑,适配全局阈值场景
from PIL import Image def enhance_image(img_path, threshold=138): black = (0, 0, 0) white = (255, 255, 255) # 直接转灰度图,不需要alpha通道 img = Image.open(img_path).convert("L") pixels = img.getdata() newPixels = [] for pixel in pixels: # 只比较亮度值 if pixel < threshold: newPixels.append(black) else: newPixels.append(white) newImg = Image.new("RGB", img.size) newImg.putdata(newPixels) newImg.save("MyTemp.jpg")
如果图像光照均匀,这个版本已经可以得到更清晰的黑白分割效果,你可以根据实际画面调整threshold参数的数值,数值越高黑色区域越多,反之白色区域越多。
方案2:用自适应阈值优化光照不均场景
如果你的图像存在阴影、光照不均匀的情况(比如你提供的示例图),用自适应阈值效果会好很多,我们可以配合OpenCV实现:
import cv2 import numpy as np from PIL import Image def enhance_image_adaptive(img_path): # 读取图像转灰度 img = cv2.imread(img_path, 0) # 高斯模糊降噪 img = cv2.GaussianBlur(img, (5,5), 0) # 自适应阈值二值化,11是邻域大小,2是修正常数 thresh = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 保存图像 cv2.imwrite("MyTemp.jpg", thresh)
这个方案会根据每个像素周围11*11区域的亮度计算专属阈值,能自动适配明暗不同的区域,黑白分割的边缘会更锐利,细节保留更完整。
示例图像参考

内容的提问来源于stack exchange,提问作者YasserKhalil
相关产品推荐
相关产品推荐

