python - OpenCV Python,去除阴影并获得轮廓
问题描述
我需要从图像中获取圆圈的轮廓。但是有一个阴影渐变。(顶部是亮的,底部是暗的)所以顶部背景的 GL 与底部圆形的 GL 相同。
我也有没有圆圈的背面图像并尝试此代码
import cv2
import matplotlib.pyplot as plt
src = './test.jpg'
img = cv2.imread(src, cv2.IMREAD_GRAYSCALE)
back_src = './back.jpg'
back = cv2.imread(back_src, cv2.IMREAD_GRAYSCALE)
diff_img = 255-cv2.absdiff(img, back)
cv2.normalize(diff_img, norm_img, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
th, threshed = cv2.threshold(norm_img, 245, 255, cv2.THRESH_BINARY)
在这张图片中,如果我设置阈值 245,我可以获得完美的二值图像。但在真实图像(灰度)中,它们很嘈杂,因此很难设置每个阈值。
我认为有更好的方法。请帮我....
解决方案
您可以为此使用自适应阈值:
gray = cv2.imread('/path/to/your/image/circles_0001.jpeg', cv2.COLOR_BGR2GRAY)
th = cv2.adaptiveThreshold(gray,255, cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY_INV,11,2)
推荐阅读
- spring-boot - 如何将布尔值设置为 JSP 变量并在 .tag 类中对其进行验证
- kentico - kentico 上的全屏覆盖
- c - 如何为覆盆子创建 float64x2_t 类型?
- javascript - 防止将类 .cke_show_borders 添加到 ckeditor 中的表格元素
- javascript - 如何根据主题在 Visual Studio Code 中定义 editor.selectionBackground?
- css - 如何在可滚动容器中拉伸 flex 子项
- java - 有没有办法使用java流来比较两个字符串?
- android-things - 我们如何使用 Raspberry Pi 3 模型和使用 Chirp 的 Android 事物开始一个简单的项目?
- sas - 从 SAS-EG 执行的 SAS 程序中的 SAS 触发错误
- php - 将下拉菜单转换为单选按钮后,Woocommerce reset_variations 链接未重置