如何消除图像光照影响并优化OpenCV图像处理方案的效果
Looking at your current code, you’ve already built a solid foundation using background subtraction, normalization, and gamma correction to reduce lighting effects—but let’s tweak a few key parts to fix the dark central area and blurry top-right lines. Here are targeted optimizations tailored to your Python 3.6.5 + OpenCV 3.4.0 environment:
1. Improve Background Extraction to Preserve Edge Details
Your current background uses dilation + median blur, which can over-blur fine edges (like the top-right lines). Swap the median blur for bilateral filtering—it smooths flat areas while retaining sharp edges, so your background will be more accurate without losing critical line details:
# Replace bg_img = cv2.medianBlur(dilated_img, 21) with: bg_img = cv2.bilateralFilter(dilated_img, d=21, sigmaColor=75, sigmaSpace=75)
You can also try a slightly smaller dilation kernel (like (5,5) instead of (7,7)) if the current dilation is overly aggressive and smudges small details.
2. Replace Global Normalization with Adaptive Histogram Equalization
The global cv2.NORM_MINMAX normalization suppresses local dark areas (like your central region) because it’s tied to the entire image’s brightness range. Switch to CLAHE (Contrast-Limited Adaptive Histogram Equalization) to enhance contrast locally:
# Remove the cv2.normalize call for diff_img, and replace with: clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) norm_img = clahe.apply(diff_img)
This brightens the dark central area independently without washing out bright regions, and the clipLimit prevents over-amplifying noise in flat areas.
3. Adjust Thresholding and Gamma Correction Parameters
- Truncation Threshold: Your current value of
253is too high—it clips almost all bright pixels, including the top-right lines. Lower it to240for gentler truncation, or use adaptive thresholding for better local control:# Replace _, thr_img = cv2.threshold(norm_img, 253, 0, cv2.THRESH_TRUNC) with: thr_img = cv2.adaptiveThreshold(norm_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) - Gamma Correction: Your current gamma value (0.3) is quite aggressive, which amplifies noise in dark areas while not giving enough boost to the center. Try a slightly higher gamma like
0.4for balanced brightness:table = np.array([((i / 255.0) ** (1.0/0.4)) * 255 for i in np.arange(0, 256)]).astype("uint8")
4. Add Minor Denoising to Clean Up Artifacts
After computing the difference image, a quick Gaussian blur will reduce small noise artifacts that interfere with subsequent processing:
diff_img = 255 - cv2.absdiff(image, bg_img) diff_img = cv2.GaussianBlur(diff_img, (3,3), 0) # Add this line
Full Modified Code Example
Here’s how the updated parse function looks with all these tweaks:
def parse(image): dilated_img = cv2.dilate(image, np.ones((5, 5), np.uint8)) # Slightly smaller dilation kernel bg_img = cv2.bilateralFilter(dilated_img, d=21, sigmaColor=75, sigmaSpace=75) # Bilateral filter instead of median blur diff_img = 255 - cv2.absdiff(image, bg_img) diff_img = cv2.GaussianBlur(diff_img, (3,3), 0) # Denoise if debug: cv2.imshow('origin vs back diff', diff_img) cv2.waitKey(0) # Use CLAHE instead of global normalization clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) norm_img = clahe.apply(diff_img) if debug: cv2.imshow('CLAHE enhanced', norm_img) cv2.waitKey(0) # Adaptive thresholding to preserve top-right lines thr_img = cv2.adaptiveThreshold(norm_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # Adjusted gamma correction table = np.array([((i / 255.0) ** (1.0/0.4)) * 255 for i in np.arange(0, 256)]).astype("uint8") thr_img = cv2.LUT(thr_img, table) if debug: cv2.imshow('final processed', thr_img) cv2.waitKey(0) cv2.destroyAllWindows() # Fixed typo "reult.JPEG" to "result.JPEG" (adjust if your filename is different) compare = cv2.resize(np.hstack([image, cv2.imread("result.JPEG", 0), thr_img]), None, fx=0.5, fy=0.5) cv2.imshow("Analysis", compare) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imwrite('./nijie.jpg', thr_img)
Key Notes
- Bilateral filtering ensures the background doesn’t blur out fine lines in the top-right.
- CLAHE fixes the dark central region by enhancing contrast locally instead of globally.
- Adaptive thresholding adapts to local brightness, keeping top-right lines sharp even in brighter areas.
- The adjusted gamma value gives balanced brightness without over-amplifying noise.
内容的提问来源于stack exchange,提问作者Wesley

