가장 큰/더 큰 직사각형 모양을 감지하고 감지 된 영역에 경계 상자를 그립니다. 윤곽 검출을 위해 완벽한 모서리 (구멍이없는 모서리)를 감지하는 다른 방법을 시도했습니다. 내가 stackoverflow 검색 및 제안 된 솔루션 OpenCV sharpen the edges (edges with no holes) 및 Segmentation Edges 내 샘플 이미지와 함께 작동하지 않았다. 나는 다음과 같은 두 이미지 Original Image 1 아래 Original Image 2가장자리를 선명하게합니다.
에 가장 큰/더 큰 직사각형 모양을 감지하고 싶은
내가 findcontour를 호출하기 전에 사전 처리에 이미지를 사용하는 코드입니다.
public Mat processGrayScaleImage(Mat grayImage){
Mat value = new Mat();
Mat sobx = new Mat();
Mat soby = new Mat();
Mat grad_abs_val_approx = new Mat();
Imgproc.GaussianBlur(grayImage, value, new Size(9, 9), 2, 2);
Mat imf = new Mat();
value.convertTo(imf, CV_32FC1, 0.5f, 0.5f);
Imgproc.Sobel(imf, sobx, -1, 1, 0);
Imgproc.Sobel(imf, soby, -1, 0, 1);
sobx = sobx.mul(sobx);
soby = soby.mul(soby);
Mat sumxy = new Mat();
//Core.add(sobx,soby, sumxy);
Core.addWeighted(sobx, 0.5, soby, 0.5, 0, sumxy);
Core.pow(sumxy, 0.5, grad_abs_val_approx);
sobx.release();
soby.release();
sumxy.release();;
Mat filtered = new Mat();
Imgproc.GaussianBlur(grad_abs_val_approx, filtered, new Size(9, 9), 2, 2);
grad_abs_val_approx.release();
final MatOfDouble mean = new MatOfDouble();
final MatOfDouble stdev = new MatOfDouble();
Core.meanStdDev(filtered, mean, stdev);
Mat thresholded = new Mat();
Imgproc.threshold(filtered, thresholded, mean.toArray()[0], 1.0, Imgproc.THRESH_TOZERO);
Mat converted = new Mat();
thresholded.convertTo(converted, CV_8UC1);
thresholded.release();
filtered.release();
return converted;
}
회색 이미지 대신 HSV 색상 공간에서 채도 채널을 시도했지만 작동하지 않습니다.
아무도 왜 위에 게시 된 코드와 함께 작동하지 않는 아이디어가 있습니까?
윤곽 검출을 위해 가장자리를 선명하게 처리하려면 어떻게해야합니까?
Java 또는 C++ 또는 Python과 관련된 모든 관련 정보를 환영합니다.
// UPDATE : 내가 처음 원본 이미지에 가우스의 차이를 테스트 한 2017년 5월 4일
. 결과는 윤곽선 감지에 유용하지 않습니다. 그 결과 이미지 xhttps : //i.stack.imgur.com/ONw9F.jpg 내가 사용하는 코드는 :
public static Mat dog(Mat grayImage){
Mat blur1 = new Mat();
Mat blur2 = new Mat();
Mat dog = new Mat();
int radius1 = 15;
int radius2 = radius1 + 6;
Imgproc.GaussianBlur(grayImage, blur1, new Size(radius1, radius1), 5);
Imgproc.GaussianBlur(grayImage, blur2, new Size(radius2, radius2), 5);
Core.absdiff(blur1, blur2, dog);
Core.multiply(dog, new Scalar(100), dog);
Imgproc.threshold(dog, dog, 55, 255, Imgproc.THRESH_BINARY_INV);
return dog;
}
는 또한 가우스의 차이 전에 CLAHE을 적용하기 위해 노력하고 여기에 결과 [이미지 결과 한 의 차이 가우스와 clahe] xhttps : //i.stack.imgur.com/DDbqg.jpg
업데이트 # 2 아래의 제안하지만, 그것이 작동하지 않는 나는 houghline을 시도
. //i.stack.imgur.com/VtGNl.jpg 최종 결과 xhttps : //i.stack 여기 는 내 코드 계조 화상
public static void houghLines(Mat greyImg, Context ctx){
Mat lines = new Mat();
Mat binary = new Mat();
Mat original = greyImg.clone();
int threshold = 35;
int minLineSize = 20;
int lineGap = 30;
Imgproc.Canny(greyImg, greyImg, 20, 30, 3, false);
Imgproc.HoughLinesP(greyImg, lines, 1, Math.PI/70, threshold, minLineSize, lineGap);
for (int x = 0; x < lines.rows(); x++)
{
double[] vec = lines.get(x, 0);
double x1 = vec[0],
y1 = vec[1],
x2 = vec[2],
y2 = vec[3];
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
double dx = x1 - x2;
double dy = y1 - y2;
double dist = Math.sqrt (dx*dx + dy*dy);
if(dist>300.d)
Imgproc.line(original, start, end, new Scalar(0,255, 0, 255),5);
}
}
제가 영리한 xhttps 적용 후 그 결과 영상에 적용 .imgur.com/KIUan.jpg
업데이트 # 3 : 나는 Houghlines하지 HoughlinesP을 시도 2017년 6월 4일
. 작동하지 않습니다. _HTTPS : //i.stack.imgur.com/6k8sF.jpg 라인 _HTTPS와 결과 이미지 : //i.stack.imgur 아래의 코드
public static void houghLines(Mat Original, Context ctx){
Mat lines = new Mat();
Mat binary = new Mat();
Mat greyImg = new Mat();
Mat im = Original.clone();
Imgproc.cvtColor(im, greyImg, Imgproc.COLOR_RGB2GRAY);
Imgproc.Canny(greyImg, binary, 20, 30, 3, true);
Imgproc.HoughLines(binary, lines, 1, Math.PI/70, 35);
for (int i = 0; i < lines.cols(); i++){
double data[] = lines.get(0, i);
double rho = data[0];
double theta = data[1];
double cosTheta = Math.cos(theta);
double sinTheta = Math.sin(theta);
double x0 = cosTheta * rho;
double y0 = sinTheta * rho;
Point pt1 = new Point(x0 + 10000 * (-sinTheta), y0 + 10000 * cosTheta);
Point pt2 = new Point(x0 - 10000 * (-sinTheta), y0 - 10000 * cosTheta);
Imgproc.line(im, pt1, pt2, new Scalar(0, 0, 200), 3);
}
}
위의 코드에 대한 결과 영리한 이미지 .com/3e9CB.jpg
이 글을 쓰고있는 현재, 나는 해결책을 찾지 못했습니다. 누구나 작동하는 솔루션에 대한 아이디어가 있습니까?
이러한 이미지를 보려면 ** 가우시안 차이 ** ** –
을 사용해보십시오. 또한 [히스토그램 평준화] (https://en.wikipedia.org/wiki/Histogram_equalization)를 사용하여 이미지. –
당신의 제안에 감사드립니다. 나는 그것을 시도하고 작동하지 않았다. 나는 내 게시물을 업데이트했습니다. – Kheuch