最近一直在看工作方面的书籍,把论文的事情搁置了,之前承诺的贴代码的事一直拖。现在把代码整理发上来,只有核心部分的,都不是我写的,我是网上整理下载的,matlab代码的效果比较差。
全部文件网盘下载地址:http://pan.baidu.com/s/1qWwNMfM;
1.C++代码
下载地址:
需要先安装opencv和boost库。
boost库下载地址:http://www.boost.org/users/download/;
boost的安装:http://www.cnblogs.com/pangxiaodong/archive/2011/05/05/2037006.html;
装这个boost库,我只是把文件复制到vs安装目录的include文件夹下。
GitHub repository:https://github.com/aperrau/DetectText
2.matlab代码
function [ swtMap ] = swt( im, searchDirection ) %swt Preforms stoke width transform on input image % A novel image operator that seeks to find the value of stroke width % for each image pixel. It‘s use is meant for the task of text % detection in natural images. % % im = RGB input image of size m x n x 3 % searchDirection = gradient direction is either 1 to detect dark text on light % background or -1 to detect light text on dark background. % % swtMap = resulting mapping of stroke withs for image pixels % Convert image to gray scale im = im2double(rgb2gray(im)); %figure, imshow(im), title(‘Black and White Image‘); % Find edges using canny edge dector edgeMap = edge(im, ‘canny‘); %figure, imshow(edgeMap), title(‘Edges Using Canny‘); % Get all edge pixel postitions [edgePointRows, edgePointCols] = find(edgeMap); % Find gradient horizontal and vertical gradient sobelMask = fspecial(‘sobel‘); dx = imfilter(im,sobelMask); dy = imfilter(im,sobelMask‘); %figure, imshow(dx, []), title(‘Horizontal Gradient Image‘); %figure, imshow(dy, []), title(‘Vertical Gradient Image‘); % Initializing matrix of gradient direction theta = zeros(size(edgeMap,1),size(edgeMap,2)); % Calculating theta, gradient direction, for each pixel on the image. % ***This can be optimized by using edgePointCols and edgePointRows % instead.*** for i=1:size(edgeMap,1) for j=1:size(edgeMap,2) if edgeMap(i,j) == 1 theta(i,j) = atan2(dy(i,j),dx(i,j)); end end end % Getting size of the image [m,n] = size(edgeMap); % Initializing Stoke Width array with infinity swtMap = zeros(m,n); for i=1:m for j=1:n swtMap(i,j) = inf; end end % Set the maximum stroke width, this number is variable for now but must be % made to be more dynamic in the future maxStrokeWidth = 350; % Initialize container for all stoke points found strokePointsX = zeros(size(edgePointCols)); strokePointsY = zeros(size(strokePointsX)); sizeOfStrokePoints = 0; % Iterate through all edge points and compute stoke widths for i=1:size(edgePointRows) step = 1; initialX = edgePointRows(i); initialY = edgePointCols(i); isStroke = 0; initialTheta = theta(initialX,initialY); sizeOfRay = 0; pointOfRayX = zeros(maxStrokeWidth,1); pointOfRayY = zeros(maxStrokeWidth,1); % Record first point of the ray pointOfRayX(sizeOfRay+1) = initialX; pointOfRayY(sizeOfRay+1) = initialY; % Increase the size of the ray sizeOfRay = sizeOfRay + 1; % Follow the ray while step < maxStrokeWidth nextX = round(initialX + cos(initialTheta) * searchDirection * step); nextY = round(initialY + sin(initialTheta) * searchDirection * step); step = step + 1; % Break loop if out of bounds. For some reason this is really % slow. if nextX < 1 | nextY < 1 | nextX > m | nextY > n break end % Record next point of the ray pointOfRayX(sizeOfRay+1) = nextX; pointOfRayY(sizeOfRay+1) = nextY; % Increase size of the ray sizeOfRay = sizeOfRay + 1; % Another edge pixel has been found if edgeMap(nextX,nextY) oppositeTheta = theta(nextX,nextY); % Gradient direction roughtly opposite if abs(abs(initialTheta - oppositeTheta) - pi) < pi/2 isStroke = 1; strokePointsX(sizeOfStrokePoints+1) = initialX; strokePointsY(sizeOfStrokePoints+1) = initialY; sizeOfStrokePoints = sizeOfStrokePoints + 1; end break end end % Edge pixel is part of stroke if isStroke % Calculate stoke width strokeWidth = sqrt((nextX - initialX)^2 + (nextY - initialY)^2); % Iterate all ray points and populate with the minimum stroke width for j=1:sizeOfRay swtMap(pointOfRayX(j),pointOfRayY(j)) = min(swtMap(pointOfRayX(j),pointOfRayY(j)),strokeWidth); end end end %figure, imshow(swtMap, []), title(‘Stroke Width Transform: First Pass‘); % Iterate through all stoke points for a refinement pass. Refer to figure % 4b in the paper. for i=1:sizeOfStrokePoints step = 1; initialX = strokePointsX(i); initialY = strokePointsY(i); initialTheta = theta(initialX,initialY); sizeOfRay = 0; pointOfRayX = zeros(maxStrokeWidth,1); pointOfRayY = zeros(maxStrokeWidth,1); swtValues = zeros(maxStrokeWidth,1); sizeOfSWTValues = 0; % Record first point of the ray pointOfRayX(sizeOfRay+1) = initialX; pointOfRayY(sizeOfRay+1) = initialY; % Increase the size of the ray sizeOfRay = sizeOfRay + 1; % Record the swt value of first stoke point swtValues(sizeOfSWTValues+1) = swtMap(initialX,initialY); sizeOfSWTValues = sizeOfSWTValues + 1; % Follow the ray while step < maxStrokeWidth nextX = round(initialX + cos(initialTheta) * searchDirection * step); nextY = round(initialY + sin(initialTheta) * searchDirection * step); step = step + 1; % Record next point of the ray pointOfRayX(sizeOfRay+1) = nextX; pointOfRayY(sizeOfRay+1) = nextY; % Increase size of the ray sizeOfRay = sizeOfRay + 1; % Record the swt value of next stoke point swtValues(sizeOfSWTValues+1) = swtMap(nextX,nextY); sizeOfSWTValues = sizeOfSWTValues + 1; % Another edge pixel has been found if edgeMap(nextX,nextY) break end end % Calculate stoke width as the median value of all swtValues seen. strokeWidth = median(swtValues(1:sizeOfSWTValues)); % Iterate all ray points and populate with the minimum stroke width for j=1:sizeOfRay swtMap(pointOfRayX(j),pointOfRayY(j)) = min(swtMap(pointOfRayX(j),pointOfRayY(j)),strokeWidth); end end %figure, imshow(swtMap, []), title(‘Stroke Width Transform: Second Pass‘); end
笔画宽度变化(C++和matlab算法)
时间: 2024-10-03 02:45:28