- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
最佳答案
这个问题有一个简单的解决方法,基本思想是在 RGB 颜色空间中分割图像以过滤掉图像中留下的黑色部分,可以简单地实现为:
import cv2
import numpy as np
ornament_image = cv2.imread("/Users/anmoluppal/Desktop/outputs/ornament.jpg")
#Considering the black range of background pixels
thresh = cv2.inRange(ornament_image, np.array([0, 0, 0]), np.array([55, 55, 55]))
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cv2.drawContours(ornament_image, contours, -1, (255,255,255), -1)
#Replace the contours with the white color same as the background
但这会去除装饰图像中一些非常小的黑色部分,为了保留这些部分,我们可以通过根据轮廓区域对它们进行排序来过滤掉一些轮廓
thresh = cv2.inRange(ornament_image, np.array([0, 0, 0]), np.array([55, 55, 55]))
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
contours = sorted(contours, key = cv2.contourArea, reverse = True)[:len(contours)/20]
cv2.drawContours(ornament_image, contours, -1, (255,255,255), -1)
注意:此方法也可以保留一些黑色背景噪声
进一步改进:
YCrCb 分割:如果您对 RGB 分割不满意,那么您也可以尝试对给定图像进行 YCrCb 分割,这通常用于数字图像。
<Masking :您可能也注意到了这一点,由于黑色补丁,装饰品的 Green Gem 内部的黑色也与背景融合在一起在其中,可以通过创建一个会阻碍给定 ROI 中的任何分割的掩码来移除它,因此保留了必要的细节,但这需要人工干预。
关于c++ - 删除图像中的小背景(黑色)区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33117974/
我是一名优秀的程序员,十分优秀!