| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 998 人关注过本帖, 1 人收藏
标题:图片旋转和提取
只看楼主 加入收藏
xiaoduzi
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-7-21
收藏(1)
 问题点数:0 回复次数:1 
图片旋转和提取
问题是这样的,扫描仪扫描一张矩形的图片,可能在扫描的时候图片摆放位置的不妥导致打印出来的图片摆放不规则,那么应该怎么写一个东西,能够识别图片的边框并且把图片旋转到适当的位置,使打印出的图片边框和纸的边框平行,具体的做法步骤应该是怎么样的,新手求指教,感激不尽!下面是个例子,前面的是扫描得到的图片,处理后先把白纸部分去掉,然后再把图片旋转正放。
现在已经能够旋转好了,附件3是目前能够实现的情况,附件4是最后处理成的样子,但是怎么把图片提取出来,去掉白纸部分啊,急求!
下面是我的代码,有人说只需要在后面加标记就可以显示了,加标记就是把灰度矩阵周围的全零行去掉吗?我是先手,不是很懂,但是这个很急,还请指教啊
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册


程序代码:
clear all
close all
Img=imread('d.jpg');
figure;imshow(Img);
Im=rgb2gray(Img);
bw=edge(Im,0.01);
figure;imshow(bw);

[H, T, R] = hough(bw);
P = houghpeaks(H, 4, 'threshold', ceil(0.3*max(H(:))));
x=T(P(:,2));y=R(P(:,1));
lines = houghlines(bw, T, R, P, 'FillGap', 20, 'MinLength', 2);%%合并距离小于50的线段,丢弃所有长度小于7的直线段

figure;imshow(bw);hold on;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

%如果要求霍夫变换的效果的话 ,这里就不能单纯的比较线段的长短的方法来确定最长直线,
%要用sort排序的方法,这里简洁了,
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
max_len = 0; % 最大直线长度
% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end

%highlight the longest line segment
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','blue');
figure ;imshow(H, [], 'XData', T, 'YData', R, 'InitialMagnification', 'fit');%fit参数就是把整个图片填充在当前窗口里
colormap('hot')
axis on
axis square

xlabel('\theta'); ylabel('\rho');
axis on; axis normal; title('霍夫变换域', 'FontWeight', 'Bold')
figure;imshow(Img); title('区域标识图像33333', 'FontWeight', 'Bold');
hold on;
% 强调最长的部分
plot(xy_long(:,1), xy_long(:,2), 'LineWidth', 2, 'Color', 'r');
x1 = xy_long(:, 1);
y1 = xy_long(:, 2);
% 求得线段的斜率
K1 = -(y1(2)-y1(1))/(x1(2)-x1(1));
angle = atan(K1)*180/pi;

Img = imrotate(Img, -90-angle, 'bilinear');
bw = imrotate(bw, -90-angle, 'bilinear');

figure; imshow(Img, []); title('原二值图像', 'FontWeight', 'Bold');
figure; imshow(bw, []); title('校正二值图像', 'FontWeight', 'Bold');

SE=strel('rectangle',[4,4]);
bw=imdilate(bw,SE);
bw=bwfill(bw,'holes');
figure;imshow(bw);
bw = bwareaopen(bw, 4000);
figure;imshow(bw);

%标记,回复原图


[ 本帖最后由 xiaoduzi 于 2013-7-21 21:30 编辑 ]
搜索更多相关主题的帖子: 扫描仪 图片 
2013-07-21 21:26
xiaoduzi
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-7-21
收藏
得分:0 
回复 楼主 xiaoduzi
这儿根本没有人回帖的么?
2013-07-22 14:05
快速回复:图片旋转和提取
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.082941 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved