순전히 정의에 따라 가장 많은 양의 검은 색 픽셀이있는 행을 파악하려고합니다. 각 행의 모든 열을 합산하고 최대 값을 찾으십시오. 그런 다음 완료되면 개수가 가장 큰 행을 찾아이 선을 빨간색으로 설정합니다.
이와 같은 것이 떠 오릅니다. StackOverflow에서 직접 이미지를 읽고 이미지 처리 도구 상자를 사용하여이 분석을 도와 드리겠습니다.
%// Read image from SO
im = imread('http://s15.postimg.org/cwg2sxnwr/mathworksss.png');
%// Keep a copy of a binary version
im_bw = im2bw(im);
%// Sum over all of the columns and look for dark pixels
row_sums = sum(~im_bw, 2);
%// Find row with max sum
[~,row_max] = max(row_sums);
%// Draw a red line through the original image as it's in RGB
im(row_max,:,1) = 255;
im(row_max,:,2:3) = 0;
%// Show the image
imshow(im);
첫 번째 이미지는 SO에서 직접 이미지를 읽어 MATLAB 작업 공간에 넣습니다. 다음 줄은 이미지를 이진화하여 분석을 더 쉽게합니다. 또한 기준선을 빨간색으로 표시 할 수 있도록 원본 이미지의 사본을 보관합니다. 그 다음 줄 sum
은 각 행의 모든 열을 개별적으로 사용 하고 합산하여 검은 색 픽셀을 더합니다. 이는 이진 이미지 를 반전 하여 어두운 픽셀이 더 밝아 지도록하여 합산을 용이하게합니다. 그런 다음을 사용 max
하여 합계가 가장 큰 행을 알아 내고이 작업은의 두 번째 출력을 확인하여 수행됩니다 max
. 이 위치를 찾으면이 행을 사용하고이 행의 모든 픽셀을 빨간색 또는 RGB = (255,0,0)
.
이 이미지를 얻습니다.
이제 위의 코드는 왼쪽에서 오른쪽으로 선을 그립니다. 이것을 제한하고 텍스트가있는 곳에 빨간 선만 그리려면 가장 왼쪽과 오른쪽에 가장 어두운 픽셀을 찾아서 약간의 숨을 쉬는 공간을 추가 한 다음 선을 그립니다. 마음에:
%// Read image from SO
im = imread('http://s15.postimg.org/cwg2sxnwr/mathworksss.png');
%// Keep a copy of a binary version
im_bw = im2bw(im);
%// Sum over all of the columns and look for dark pixels
row_sums = sum(~im_bw, 2);
%// Find row with max sum
[~,row_max] = max(row_sums);
%// Find left most and right most black columns
[~,left_most] = find(~im_bw,1,'first');
[~,right_most] = find(~im_bw,1,'last');
%// Buffer for drawing the line before the first and after the last column
buf = 20;
%// Draw the line
im(row_max,left_most-buf:right_most+buf,1) = 255;
im(row_max,left_most-buf:right_most+buf,2:3) = 0;
%// Show the image
imshow(im);
보시다시피, 대부분의 코드는 동일하게 유지 max
되지만 ( 이미지 읽기, 임계 값, 열 합산 및 ) 끝으로 갈수록 find
열과 관련하여 검정색 픽셀의 첫 번째와 마지막 인스턴스를 찾는 데 사용 합니다. 그런 다음 이전에 찾은 동일한 최대 행으로이 열을 사용하고 가장 왼쪽에있는 검은 색 열 픽셀 위치를 빼고 가장 오른쪽에있는 검은 색 열 픽셀 위치를 버퍼 양만큼 더한 다음 (여기서는 20 개를 선택했습니다)이 안에 픽셀 라인을 설정합니다. 영역을 빨간색으로 변경합니다.
우리는 :
이제 두 번째로 높은 합계를 가진 행을 찾고 그 행을 통해 다른 선을 그리는 것이 당신의 소원입니다. 그것은 나쁘지 않습니다. 그러나 각 문자의 바깥 쪽 가장자리가 단일 픽셀 두께가 아니기 때문에 약간의 후 처리가 필요하므로 두 번째로 높은 합계는 실제로 첫 번째 최대 값 근처에있는 행을 제공 할 수 있습니다. 따라서 텍스트를 약간 축소 한 다음 행 합계 논리를 다시 적용하는 것이 좋습니다. 작은 구조 요소를 사용하여 형태 학적 이진 침식 으로 이를 수행 할 수 있습니다 . 예를 들어 3 x 3 정사각형입니다. 이것은 imerode
침식에 대해 수행 할 수 있으며 strel
사각형 구조 요소를 지정하는 데 사용할 수 있습니다 .
이 새 이미지에 행 합계 논리를 적용한 다음 이러한 결과를 사용하고 원본 이미지에 그립니다. 단일 픽셀 두께의 텍스트 영역이 일부 있고 침식 후 제거되는 것처럼 보이기 때문에이 새 이미지에 대해 작업하고 싶지 않습니다.
다음과 같은 것이 떠 오릅니다.
%// Read image from SO
im = imread('http://s15.postimg.org/cwg2sxnwr/mathworksss.png');
%// Keep a copy of a binary version - also invert for ease
im_bw = ~im2bw(im);
%// Slightly erode the text
im_bw = imerode(im_bw, strel('square', 3));
%// Sum over all of the columns and look for dark pixels
row_sums = sum(im_bw, 2);
%// Sort the column sums in descending order and figure out the two highest sums
[~,ind_sort] = sort(row_sums,'descend');
%// First highest sum is the bottom - mark as red
red_row1 = ind_sort(1);
%// Second highest sum is the middle - mark as red too
red_row2 = ind_sort(2);
%// Find left most and right most black columns
[~,left_most] = find(im_bw,1,'first');
[~,right_most] = find(im_bw,1,'last');
%// Buffer for drawing the line before the first and after the last column
buf = 20;
%// Draw the two red lines
im(red_row1,left_most-buf:right_most+buf,1) = 255;
im(red_row1,left_most-buf:right_most+buf,2:3) = 0;
im(red_row2,left_most-buf:right_most+buf,1) = 255;
im(red_row2,left_most-buf:right_most+buf,2:3) = 0;
%// Show the image
imshow(im);
보시다시피 대부분의 논리는 동일합니다. 내가 정말로 변경 한 유일한 것은 이미지를 침식하고 행 합계를 내림차순으로 정렬하고 가장 높은 처음 두 위치를 추출한 것입니다. 그런 다음 논리를 반복하여 행을 통해 선을 그렸지만 이제 한 행 대신 두 개가 있습니다.
우리는 :
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다