不确定这是否是正确的询问方式,但请提供帮助。我有一张凹陷车的图像。我必须处理它并突出凹痕并返回凹痕的数量。我能够很好地完成以下结果:
matlab代码是:
img2=rgb2gray(i1);
imshow(img2);
img3=imtophat(img2,strel('disk',15));
img4=imadjust(img3);
layer=img4(:,:,1);
img5=layer>100 & layer<250;
img6=imfill(img5,'holes');
img7=bwareaopen(img6,5);
[L,ans]=bwlabeln(img7);
imshow(img7);
I=imread(i1);
Ians=CarDentIdentification(I);
但是,当我尝试使用opencv执行此操作时,我得到了这个:
使用以下代码:
Imgproc.cvtColor(source, middle, Imgproc.COLOR_RGB2GRAY);
Imgproc.equalizeHist(middle, middle);
Imgproc.threshold(middle, middle, 150, 255, Imgproc.THRESH_OTSU);
请告诉我如何在opencv中获得更好的结果,以及如何计算凹痕?我试过findcontour(),但它给出了一个非常大的数字。我也尝试过其他图像,但是我没有得到正确的结果。 请帮忙。
答案 0 :(得分:0)
所以你基本上来自MATLAB site,imtophat
- Top-hat过滤计算图像的形态开口(使用imopen),然后从原始图像中减去结果。
您可以使用以下步骤在OpenCV中执行此操作:
第1步:获取磁盘结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))
步骤2:计算图像的打开,然后从原始图像中减去结果
tophat = cv2.morphologyEx(v, cv2.MORPH_TOPHAT, kernel)
这给出了以下结果 -
步骤3 - 现在您可以手动限制它或使用Otsu -
ret, thresh = cv2.threshold(tophat, 17, 255, 0)
为您提供以下图片 -
由于OP需要Java中的代码,因此这里是Java
中的可能代码:
private Mat topHat(Mat image)
{
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(15, 15), new Point (0, 0));
Mat dst = new Mat;
Imgproc.morphologyEx(image, dst, Imgproc.MORPH_TOPHAT, element, new Point(0, 0));
return dst;
}
确保在灰度图像(CvType.8UC1
)上执行此操作,然后您可以适当地设置阈值。