好吧,所以我有一个直方图(由一组整数表示),我正在寻找找到局部最大值和最小值的最佳方法.每个直方图应该有3个峰值,其中一个(第一个)可能比其他峰值高得多.
我想做几件事:
在第一个峰值之后找到第一个"山谷"(为了完全消除图中的第一个峰值)
找到剩余两个峰之间的最佳"谷值"以分离图片
我已经知道如何通过实现Otsu的变体来执行第2步.但我正在努力迈出第1步
如果两个剩余峰值之间的山谷不够低,我想发出警告.
此外,图像非常干净,几乎没有噪音
执行步骤1和3的蛮力算法是什么?我可以找到一种方法来实现Otsu,但是数学方面的蛮力正在逃避我.事实证明,有更多关于像otsu这样的方法的文档,而不是简单地找到峰值和谷值.我不是在寻找任何比完成工作更多的东西(即它是一个临时解决方案,只需要在合理的时间范围内实施,直到我可以花更多的时间在它上面)
我在c#中做这一切
任何有关采取哪些步骤的帮助将不胜感激!非常感谢!
编辑:更多数据:
大多数直方图可能与第一个直方图相似,第一个峰值代表背景.


image-processing mathematical-optimization histogram image-segmentation c#-4.0
我想将图像的像素分类为"是街道"或"不是街道".我有一些来自KITTI数据集的训练数据,我看到Caffe有一个IMAGE_DATA图层类型.标签的形式与输入图像的尺寸相同.
除了Caffe之外,我解决这个问题的第一个想法是在像素周围给出图像补丁,这些补像应该被分类(例如,20个像素到顶部/左/右/底部,导致每个像素有41×41 = 1681个特征我想要分类.
不过,如果我可以告诉朱古力如何使用标签,而不必手动创建这些图像块(与层类型IMAGE_DATA似乎表明,它是可能的),我宁愿.
Caffe可以直接对图像的像素进行分类吗?这样的原型文件网络定义怎么样?我如何向Caffe提供有关标签的信息?
我猜输入层会是这样的
layers {
name: "data"
type: IMAGE_DATA
top: "data"
top: "label"
image_data_param {
source: "path/to/file_list.txt"
mean_file: "path/to/imagenet_mean.binaryproto"
batch_size: 4
crop_size: 41
mirror: false
new_height: 256
new_width: 256
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不确定crop_size究竟是什么意思.它真的居中吗?caffe如何处理角点像素?什么是new_height和new_width好了?
computer-vision neural-network image-segmentation deep-learning caffe
我正在尝试实现类似完全卷积网络的东西,其中最后一个卷积层使用过滤器大小1x1并输出"得分"张量.分数张量具有形状[批次,高度,宽度,num_classes].
我的问题是,张量流中的哪个函数可以对每个像素应用softmax操作,与其他像素无关.tf.nn.softmax操作似乎不是为了这个目的.
如果没有这样的操作,我想我必须自己写一个.
谢谢!
更新:如果我必须自己实现,我想我可能需要将输入张量重新整形为[N,num_claees],其中N =批量x宽度x高度,并应用tf.nn.softmax,然后重新整形.是否有意义?
我知道图像分类问题的不平衡,例如猫与狗的分类,如果猫图像太多而狗图像太少.但我不知道如何解决分割问题的不平衡.
例如,我的任务是从卫星图像中掩盖云层,因此我将问题转换为两类分割,一类是云,另一类是背景.该数据集具有5800个4波段16位图像,大小为256*256.该体系结构是Segnet,损失函数是二进制交叉熵.
假设有两种情况:
所以,案例2是平衡的我猜,但案例1如何?
在现实和我的任务中,这两种情况在源卫星图像中是不可能的,因为云层总是相对较小的背景,但如果图像样本由于它们的大尺寸而从源图像中裁剪,则会出现一些新的情况.
因此,样本总是包含三种类型的图像:
我的问题:
样品是否不平衡,我该怎么办?
提前致谢.
machine-learning image-processing image-segmentation caffe keras
u-net 架构中有一个著名的技巧,就是使用自定义权重图来提高准确性。下面是它的详细信息:
现在,通过在这里和其他多个地方询问,我了解了 2 种方法。我想知道哪个是正确的,或者还有其他更正确的正确方法吗?
首先是torch.nn.Functional在训练循环中使用方法:
loss = torch.nn.functional.cross_entropy(output, target, w) 其中 w 将是计算出的自定义重量。
二是reduction='none'在训练循环外调用损失函数时
使用criterion = torch.nn.CrossEntropy(reduction='none')
然后在训练循环中乘以自定义权重:
gt # Ground truth, format torch.long
pd # Network output
W # per-element weighting based on the distance map from UNet
loss = criterion(pd, gt)
loss = W*loss # Ensure that weights are scaled appropriately
loss = torch.sum(loss.flatten(start_dim=1), axis=0) # Sums the loss per image
loss = torch.mean(loss) # Average across a batch
Run Code Online (Sandbox Code Playgroud)
现在,我有点困惑哪个是正确的,或者还有其他方法,还是两者都是正确的?
我一直在尝试清除 OCR 图像:(线条)
我需要删除这些行以有时进一步处理图像并且我已经非常接近但很多时间阈值从文本中带走了太多:
copy = img.copy()
blur = cv2.GaussianBlur(copy, (9,9), 0)
thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,30)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9,9))
dilate = cv2.dilate(thresh, kernel, iterations=2)
cnts = cv2.findContours(dilate, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area > 300:
x,y,w,h = cv2.boundingRect(c)
cv2.rectangle(copy, (x, y), (x + w, y + h), (36,255,12), 3)
Run Code Online (Sandbox Code Playgroud)
编辑:此外,如果字体发生变化,使用常量数字将不起作用。有没有通用的方法来做到这一点?
考虑以下图像,存储为 numpy 数组:
a = [[0,0,0,0,0,1,1,0,0,0],
[0,0,0,0,1,1,1,1,0,0],
[0,0,0,0,0,1,1,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,2,0,0,0,0],
[0,0,0,0,0,2,2,0,0,0],
[0,0,0,0,0,2,0,0,0,0],
[0,0,0,0,3,3,3,0,0,0],
[4,0,0,0,0,0,0,0,0,0],
[4,4,0,0,0,0,0,0,0,0],
[4,4,4,0,0,0,0,0,0,0]]
a = np.array(a)
Run Code Online (Sandbox Code Playgroud)
零代表背景像素,1、2、3 和 4 代表属于对象的像素。您可以看到对象总是在图像中形成连续的岛屿或区域。我想知道每对物体之间的距离。作为距离度量,我希望在对象的那些像素之间具有最短的直线距离,它们彼此最接近。示例:Distance(2,3) = 1,因为它们在接触。Distance(1,2) = 2,因为正好有一个背景像素将两个区域分开,或者换句话说,对象的最近像素相隔两个像素。
谁能告诉我如何在 Python 中解决这个问题?或者给我链接一些资源?
我试图从研究论文中描述的给定图像中提取头发,使用能量最小化的概念,能量函数依赖于先验概率和YCrCb颜色似然直方图.能量函数定义为:
(x)= data(x)+smooth(x).
Run Code Online (Sandbox Code Playgroud)
data(x)= - Σ(log(I(x)| x)+ logsel(x)) [先验概率模型]
smooth(x)=Σ(x≠x)exp( - ||(x) - (x)|| ^ 2 /) [先前的YcrCb颜色模型]
我很困惑如何标记给定的图形(图像的像素被视为图形的节点).我尝试使用以下方法标记图形,但结果不符合预期:
def get_Edata(prob_dist, ycrcb_dist, img_y, img_x, pix):
e_data = 0
Y, Cr, Cb = pix
if ycrcb_dist[int(Y/4)][int(Cr/4)][int(Cb/4)] > 0 and prob_dist[img_y][img_x]>0:
e_data = -1*(math.log(ycrcb_dist[int(Y/4)][int(Cr/4)][int(Cb/4)], 10) + math.log(prob_dist[img_y][img_x], 10))
return e_data
def get_ESmooth(normalization_constant, pix_1, pix_2):
return math.exp(-(math.ceil(pix_1[0] - pix_2[0])**2)/normalization_constant)
Run Code Online (Sandbox Code Playgroud)
虽然在图表中的节点之间添加权重,但我使用:
#adding the edges between neighbouring pixels.
img_graph.add_edge(central_node, neighbour_nodes, eSmooth, 0)
#adding the edges from source to node and from node to …Run Code Online (Sandbox Code Playgroud) 如何在目标点连接这些线?图像是骨架化过程的结果.


我正在尝试使用分水岭变换将每一行分割为一个区域.
python opencv image-processing edge-detection image-segmentation
当我训练 UNET 时,dice coef 和 iou 有时会变得大于 1 和iou > dice,然后经过几个批次后它们又会恢复正常。如图所示。
我将它们定义如下:
def dice_coef(y_true, y_pred, smooth=1):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)
def iou(y_true, y_pred, smooth=1):
y_true_f = K.flatten(y_true)
y_pred_f = K.flatten(y_pred)
intersection = K.sum(y_true_f * y_pred_f)
union = K.sum(y_true_f) + K.sum(y_pred_f) - intersection
return (intersection + smooth) / (union + smooth)
def dice_loss(y_true, y_pred):
return 1. - dice_coef(y_true, …Run Code Online (Sandbox Code Playgroud)