首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python和opencv从给定的图像中删除热点?

如何使用Python和opencv从给定的图像中删除热点?
EN

Data Science用户
提问于 2023-05-27 06:02:22
回答 2查看 223关注 0票数 4

在下面的图片中,有一些区域非常明亮(即更白)。一些明亮的区域是宽的,有些是窄的或薄的。红色盒子盖着一个这么宽的亮点,蓝色盒子盖着一个薄薄的亮点。薄的亮点称为边缘,宽的亮点称为热点.

我想要删除所有热点从图像(即使他们黑色),但不应该删除边缘。

我的问题是如何使用OpenCV编写Python代码以删除所有热点但没有边缘?

EN

回答 2

Data Science用户

发布于 2023-06-01 18:47:34

您能使用OpenCV尝试以下方法吗?

这背后的逻辑是:

  1. 将图像转换为灰度。
  2. 在图像上应用高斯模糊来平滑边缘。
  3. 阈值图像以创建一个二值图像,其中热点是白色的,其余的图像是黑色的。
  4. 放大二值图像,以填补热点上的任何小洞.
  5. 在膨胀的图像中找到轮廓。
  6. 迭代等高线,并删除任何不够大的。
  7. 用黑色填写剩余的轮廓线。导入cv2 def remove_hotspots(图像):#将图像转换为灰度=cv2.cvtColor(图像,cv2.COLOR_BGR2GRAY) #将高斯模糊应用于图像,以平滑边缘模糊=cv2.GaussianBlur(灰色,(5,5),0) #阈值,以创建一个二值图像,其中热点为白色,其余图像为黑色阈值=cv2.阈值( blur,128,255,cv2.THRESH_BINARY)1 #扩展二值图像以填补热点中的任何小孔--扩展=cv2。扩展(阈值,无,iterations=2) #在扩展图像轮廓中查找等高线,层次结构=cv2.findCon管(扩展,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) #在等高线上迭代并移除范围内对i不够大的部分(连(等高线)):如果cv2.等高线(等高线我)< 100:继续#用黑色cv2填充等高线(图像,轮廓,i,0,-1)如果__name__ ==“__main__”返回图像:# Load图像= cv2.imread("image.jpg") #删除热点new_image =remove_hotspots(图像)#显示原始图像和新图像cv2.imShow(“原始”,图像)cv2.imShow(“新”,new_image) cv2.wayKey(0)cv2.deyAllwindows()
票数 1
EN

Data Science用户

发布于 2023-06-03 14:06:33

基于这个答案的算法我已经编写了我的代码,它正在按预期工作。

以下是编码步骤的细目:

  1. Otsu的阈值化应用于灰度image1,使用带有cv2.THRESH_BINARY + cv2.THRESH_OTSU标志的cv2.阈值()来获得image2。
  2. 使用cv2.erode()在image2上执行冲蚀操作,并带有一个方形内核以获得image3。
  3. 定义了阈值距离K。
  4. 使用cv2.getStructuringElement()创建一个具有cv2.MORPH_ELLIPSE形状和尺寸(2 * K,2* K)的圆形掩码。
  5. 嵌套循环在image1的像素上迭代。
  6. 如果image2中的像素值大于0(表示热点),则提取image3中当前像素周围的邻域。
  7. 如果邻域中像素值的总和大于0,表示在K距离内image3中存在照明像素,则最终图像中的相应像素设置为0(黑色)。
  8. 最后的图像使用cv2.imshow()显示。请注意,在此实现中,使用的是方2*K的正方形区域,而不是圆形掩码。可以通过修改代码中的掩码变量来调整圆形或正方形区域之间的选择。随时调整阈值距离K,并试验不同形状和大小的邻里面具,以满足您的具体要求。
代码语言:javascript
复制
import cv2
import numpy as np
# Load the image
image1 = cv2.imread('orange.jpg', cv2.IMREAD_GRAYSCALE)
original_image = image1
# Otsu's thresholding
_, image2 = cv2.threshold(image1, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# Erosion
kernel = np.ones((5, 5), np.uint8)
image3 = cv2.erode(image2, kernel, iterations=1)
# Define the threshold distance K
K = 2
# Create the circular mask
mask = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2 * K, 2 * K))
# Iterate over image1 pixels and generate the final image
final_image = np.copy(image1)
for y in range(image1.shape[0]):
  for x in range(image1.shape[1]):
     if image2[y, x] > 0:
     # Check if any illuminated pixel exists within K distance in image3
        neighborhood = image3[max(y - K, 0):min(y + K + 1, image3.shape[0]),
                    max(x - K, 0):min(x + K + 1, image3.shape[1])]
        if np.sum(neighborhood) > 0:
           final_image[y, x] = 0
# Display the original and final image
cv2.imshow('Original', original_image)
cv2.imshow('Final Image', final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/121793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档