0

가장 큰/더 큰 직사각형 모양을 감지하고 감지 된 영역에 경계 상자를 그립니다. 윤곽 검출을 위해 완벽한 모서리 (구멍이없는 모서리)를 감지하는 다른 방법을 시도했습니다. 내가 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

이 글을 쓰고있는 현재, 나는 해결책을 찾지 못했습니다. 누구나 작동하는 솔루션에 대한 아이디어가 있습니까?

+0

이러한 이미지를 보려면 ** 가우시안 차이 ** ** –

+1

을 사용해보십시오. 또한 [히스토그램 평준화] (https://en.wikipedia.org/wiki/Histogram_equalization)를 사용하여 이미지. –

+0

당신의 제안에 감사드립니다. 나는 그것을 시도하고 작동하지 않았다. 나는 내 게시물을 업데이트했습니다. – Kheuch

답변

0

공유 한 이미지를 빠르게 확인했습니다.그리고 나는 canny와 hough 라인의 매개 변수를 약간 조정 한 후에이 결과를 얻었습니다. 어떤 종류의 일반화가 필요한지 확실하지 않지만 한 번 사용해보십시오. 내가 가진

import cv2 as cv2 
import numpy as np 

# fn = '2PeyG.jpg' 
fn = 'qEFMj.jpg' 
r_scale = 0.1 
# OpenCV reads image with BGR format 
img = cv2.imread(fn) 
img = cv2.resize(img, (0, 0), fx=r_scale, fy=r_scale) 
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
edges = cv2.Canny(img, 20, 30, apertureSize=3) 


lines = cv2.HoughLines(edges, 1, np.pi/70, 35) 

for rho, theta in lines[0]: 
    if (np.pi/70 <= theta <= np.pi/7) or (2.056 < theta < 4.970) or (1.570 <= theta <= 1.600): 

     a = np.cos(theta) 
     b = np.sin(theta) 
     x0 = a*rho 
     y0 = b*rho 
     x1 = int(x0 + 1000*(-b)) 
     y1 = int(y0 + 1000*(a)) 

     x2 = int(x0 - 1000*(-b)) 
     y2 = int(y0 - 1000*(a)) 

     cv2.line(img,(x1,y1),(x2,y2),(0,0,255),1) 


cv2.imshow('edges', edges) 
cv2.imshow('overlay', img) 

# cv2.imwrite('lines_overlay.png', img) 
cv2.waitKey(3000) 

결과는 내가이 정확히 무엇을 찾고되지 않습니다 동의하지만, 아마도 좋은 출발점이

enter image description here

이었다

여기 내 코드입니다. 희망이 도움 :

+0

시험해 주셔서 감사합니다. 귀하의 솔루션을 시도했지만 동일한 결과가 없습니다. 내 게시물을 확인하십시오. 내 제안을 업데이트했습니다. – Kheuch

+0

HoughLinesP가 아니라 HoughLines를 사용해보실 수 있습니까? 왜 당신이 같은 결과를 얻을 수 없는지 궁금합니다. 또한 이것은 내 캐니 에지 검출기 결과입니다. 너 똑같은거야? https://i.stack.imgur.com/AAcis.png – harshkn

+0

제안대로 HoughLines를 사용해 보았습니다. 제 게시물을 자세히 수정했습니다. canny는 https://i.stack.imgur.com/6k8sF.jpg이며 최종 결과는 https://i.stack.imgur.com/3e9CB.jpg입니다. 알 수 있듯이, 작동하지 않았습니다. 그것은 이상해. – Kheuch