Har*_*ita 5 android opencv image-processing
不确定这是否是正确的询问方式,但请帮忙.我有一张凹陷车的图像.我必须处理它并突出凹痕并返回凹痕的数量.我能够很好地完成以下结果:
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);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用opencv执行此操作时,我得到了这个:
使用以下代码:
Imgproc.cvtColor(source, middle, Imgproc.COLOR_RGB2GRAY);
Imgproc.equalizeHist(middle, middle);
Imgproc.threshold(middle, middle, 150, 255, Imgproc.THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)
请告诉我如何在opencv中获得更好的结果,以及如何计算凹痕?我试过findcontour(),但它给出了一个非常大的数字.我也尝试过其他图像,但是我没有得到正确的结果.请帮忙.
所以你基本上从MATLAB站点,imtophat
做 - Top-hat 过滤计算图像的形态开口(使用 imopen),然后从原始图像中减去结果。
您可以通过以下步骤在 OpenCV 中执行此操作:
步骤1:获取磁盘结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))
Run Code Online (Sandbox Code Playgroud)
步骤2:计算图像的开度,然后从原始图像中减去结果
tophat = cv2.morphologyEx(v, cv2.MORPH_TOPHAT, kernel)
Run Code Online (Sandbox Code Playgroud)
这给出了以下结果 -
第 3 步 - 现在您可以手动设置阈值或使用 Otsu -
ret, thresh = cv2.threshold(tophat, 17, 255, 0)
Run Code Online (Sandbox Code Playgroud)
这会给你下面的图片 -
由于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;
}
Run Code Online (Sandbox Code Playgroud)
确保在灰度图像 (CvType.8UC1
) 上执行此操作,然后可以适当地设置阈值。
归档时间: |
|
查看次数: |
816 次 |
最近记录: |