python - 检测图像上的裂缝_使用scikit-image标签修改图像
问题描述
这是我的背景:我有一张混凝土墙的图像,我想在上面检测裂缝。基于这个家伙的想法(https://digitalcommons.usu.edu/cee_facpub/1234/)和其他最先进的方法,我已经将灰度图像应用于我的灰度图像 Otsu 阈值和形态学操作(关闭),所以像素图像从 0(背景)到 1。
现在,我想做的是:我想从图像中删除垂直或水平的连接像素(例如墙上的管道)。为此,我使用以下代码:
import cv2
import numpy as np
from skimage.measure import label, regionprops, regionprops_table
from skimage import filters
from math import *
img = cv2.imread('C:/Users/Caroline/Documents/myimage.tif', -1)
label_img = label(img) #Label the different regions of the image
regions = regionprops_table(label_img, properties=('label', 'orientation')) #Compute the properties "orientation" of each regions
orientinter = list(regions.values())
orientradian = orientinter[1] #kind of a conversion to only get the orientation with an array and not a dictionary
orientationdeg = orientradian * 180/pi #conversion in degrees from radians
v1=np.where(abs(orientationdeg)<1) #getting the index of the objects that are horizontals
v2=np.where(abs(orientationdeg)>89) #getting the index of the objects that are verticals
#eventually merging v1 and v2 to have a triple of "every index of the regions I want to get rid of"
我的问题是:从现在开始,我该如何继续?我的意思是,我有要与背景合并的区域的索引/标签(不确定词汇表)(为图片上的这些像素分配值 0)。但是我不知道如何在区域索引/标签和图像之间建立“链接”,以及如何将这些区域分配给图像中的 0。在伪代码中,我认为它会是这样的:
for the regions in merge(v1 and v2)
set their pixel values to 0 in LabelImg
感谢您的帮助和评论!
解决方案
(新网站,所以我不知道当你找到答案时回答你自己的问题是否是公共程序)
这是我用来完成工作的代码!它可能需要更新以提高效率以及预处理步骤。希望它可以帮助其他人。
import cv2
import numpy as np
from numpy import array
from skimage.measure import label, regionprops, regionprops_table
from skimage import filters
from math import *
img = cv2.imread('C:/Users/Caroline/Documents/myimg.tif', -1)
label_img = label(img) #Label the image
regions = regionprops_table(label_img, properties=('label', 'orientation')) #Compute properties 'label' et 'orientation' of each regions
orientinter = list(regions.values())
orientradian = orientinter[1] #conversion in array
orientationdeg = orientradian * 180/pi #conversion en degré
L = [(abs(orientationdeg) < 89) & (abs(orientationdeg) >1)] #return list with true ou false
#True beeing the region that are NOT horizontal/vertical
V = newList[0] #conversion of the list in array
r = V*1 #there will be zeros for the regions horizontal/vertical, and the orientation otherwise
Vprime= np.argwhere(r)+1 #get the non zeros index of. +1 because index starts at 0, and we want labels, they start at 1
#now Vprime is all the labels of non vertical/horizontal regions
a=np.in1d(label_img, Vprime)*1 #the ismember matlab fonction, for this application
img_final=np.reshape(a,label_img.shape)
#Export final image
推荐阅读
- r - 是否有更轻的 Rstudio 版本可用?
- javascript - 反应 setState 数组问题
- vb.net - 从 VB.NET 调用时注销、重新启动和关闭访问被拒绝 (5)
- flutter - 参数类型“Function”不能分配给参数类型“void Function()?” 在零安全之后
- c++ - 在 C++ 中实现自定义 unordered_map 容器的高效插入
- sed - 选择并替换从第一次出现的定义字符到最后一次出现的字符串
- javascript - 浏览器离线时如何终止 JavaScript XMLHttpRequest
- kotlin - 通用接口上的 Kotlin 扩展函数
- java - 有没有办法用 Mockito 测试所有 5XX 或 4XX 代码?
- python - Pandas 从包含字典列表的行创建新数据框的方法