这篇文章是《数字图像处理原理与实践(MATLAB文本)》一本书的代码系列Part7(由于调整先前宣布订单,请读者注意分页程序,而不仅仅是基于标题数的一系列文章),第一本书特色186经225的代码页,有需要的读者下载用于科研。已经过半。代码运行结果请參见原书配图,建议下载代码前阅读下文:

关于《数字图像处理原理与实践(MATLAB版)》一书代码公布的说明

http://blog.csdn.net/baimafujinji/article/details/40987807

P186

A = rgb2gray(imread('circle.png'));
B = edge(A, 'canny');
[centers, radii, metric] = imfindcircles(B,[22 65]);
imshow(A);
viscircles(centers, radii,'EdgeColor','b');

P195

BW = imread('contour.bmp');
imshow(BW,[]);
hold on

s=size(BW);
for row = 2:55:s(1)
   for col=1:s(2)
      if BW(row,col),
         break;
      end
   end

contour = bwtraceboundary(BW, [row, col], 'W', 8);
   if(~isempty(contour))
      plot(contour(:,2),contour(:,1),'g','LineWidth',2);
   end
end

P197

I = im2bw(imread('penguins.bmp'), 0.38);
BW = 1-I;
B = bwboundaries(BW,8,'noholes');
imshow(I)
hold on

for k = 1:length(B)
    boundary = B{k};
    plot(boundary(:,2), boundary(:,1), 'g', 'LineWidth', 2)
end

补充一点小技巧。先前在写Demo的时候没想过这个问题。后来是由于要为图书做插图。所以就须要把处理结果的白边去掉,以下这段代码实现了这样的结果。与图像处理无关。这样的方法也没有出如今书里。不过关于MATLAB保存图像时的一点小技巧而已。

I = im2bw(imread('penguins.bmp'), 0.38);
BW = 1-I;
B = bwboundaries(BW,8,'noholes');
imshow(I,'border','tight');
hold on

for k = 1:length(B)
    boundary = B{k};
    plot(boundary(:,2), boundary(:,1), 'g', 'LineWidth', 2)
end

saveas(gcf,'pengs3.bmp');

P203

I = imread('nums.bmp');
locs =[57 64;47 103;81 224;94 274;11 365;85 461;86 540];
BW = imfill(I, locs, 4);
imshow(BW);

P204

I = imread('nums.bmp');
BW2 = imfill(I,'holes');
imshow(BW2);

P205

I = imread('tire.tif');
I2 = imfill(I);
figure, imshow(I), figure, imshow(I2)

P206

I = imread('eight.tif');
c = [222 272 300 270 221 194];
r = [21 21 75 121 121 75];
J = roifill(I,c,r);
imshow(I)
figure, imshow(J)

P207

function J = regiongrowing(I,x,y,threshold)

if(exist('threshold','var')==0), threshold=0.2; end
J = zeros(size(I)); % 用来标记输出结果的二值矩阵
[m n] = size(I); % 输入图像的尺寸
reg_mean = I(x,y); % 被切割区域的灰度均值
reg_size = 1; % 区域中像素的数目
% 用以存储被切割出来的区域的邻域点的堆栈
neg_free = 10000; neg_pos=0;
neg_list = zeros(neg_free,3);
delta=0; % 最新被引入的像素与区域灰度均值的差值

% 区域生长直至满足终止条件
while(delta<threshold && reg_size<numel(I))

% 检測邻域像素,并判读是否将其划入区域
    for i = -1:1
        for j = -1:1
            xn = x + i; yn = y + j; % 计算邻域点的坐标
            % 检查邻域像素是否越界
            indicator = (xn >= 1)&&(yn >= 1)&&(xn <= m)&&(yn <= n);
        
            % 假设邻域像素还不属于被切割区域则增加堆栈
            if(indicator && (J(xn,yn)==0))
                neg_pos = neg_pos+1;
                neg_list(neg_pos,:) = [xn yn I(xn,yn)]; J(xn,yn)=1;
            end
        end
    end
    
    if(neg_pos+10>neg_free), % 假设堆栈空间不足。则对其进行扩容
        neg_free=neg_free+10000;
        neg_list((neg_pos+1):neg_free,:)=0;
    end
    
    % 将那些灰度值最接近区域均值的像素增加到区域中去
    dist = abs(neg_list(1:neg_pos,3)-reg_mean);
    [delta, index] = min(dist);
    J(x,y)=2; reg_size=reg_size+1;
    
    % 计算新区域的均值
    reg_mean = (reg_mean*reg_size + neg_list(index,3))/(reg_size+1);
    % 保存像素坐标。然后将像素从堆栈中移除
    x = neg_list(index,1); y = neg_list(index,2);
    neg_list(index,:)=neg_list(neg_pos,:); neg_pos=neg_pos-1;
end

% 将由区域生长得到的切割区域以二值矩阵的形式返回
J=J>1;

P208

I = im2double(rgb2gray(imread('penguins.bmp')));
x = 244; y = 679;
J = regiongrowing(I,x,y,0.2);
figure, imshow(I+J);

P213

I = imread('liftingbody.png');
S = qtdecomp(I,.27);
blocks = repmat(uint8(0),size(S));

for dim = [512 256 128 64 32 16 8 4 2 1];    
  numblocks = length(find(S==dim));    
  if (numblocks > 0)        
    values = repmat(uint8(1),[dim dim numblocks]);
    values(2:dim,2:dim,:) = 0;
    blocks = qtsetblk(blocks,S,dim,values);
  end
end

blocks(end,1:end) = 1;
blocks(1:end,end) = 1;
imshow(I), figure, imshow(blocks,[])

P219

rgb = imread('potatos.jpg');
I = rgb2gray(rgb);

hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);

L = watershed(gradmag);
Lrgb = label2rgb(L);
figure
subplot(1, 2, 1); imshow(gradmag,[]), title('梯度幅值图像')
subplot(1, 2, 2); imshow(Lrgb); title('对梯度图直接做分水岭切割')

P221-P224

rgb = imread('potatos.jpg');
I = rgb2gray(rgb);

hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);

se = strel('disk', 12);
Ie = imerode(I, se);
Iobr = imreconstruct(Ie, I);

Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);

fgm = imregionalmax(Iobrcbr);
It1 = rgb(:, :, 1);
It2 = rgb(:, :, 2);
It3 = rgb(:, :, 3);
It1(fgm) = 255; It2(fgm) = 0; It3(fgm) = 0;
I2 = cat(3, It1, It2, It3);

figure
subplot(1, 2, 1); imshow(fgm, []); title('局部极大值图像');
subplot(1, 2, 2); imshow(I2); title('局部极大值叠加图像');

se2 = strel(ones(15,15));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2);
fgm4 = bwareaopen(fgm3, 400);

bw = im2bw(Iobrcbr, graythresh(Iobrcbr));
D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
gradmag2 = imimposemin(gradmag, bgm | fgm4);

L = watershed(gradmag2);
%第一种显示方法
Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');
figure
subplot(1,2,1), imshow(Lrgb), title('分水岭切割结果显示1');
%另外一种显示方法
subplot(1, 2, 2); imshow(rgb, []), title('分水岭切割结果显示2');
hold on;
himage = imshow(Lrgb);
set(himage, 'AlphaData', 0.3);

(代码公布未完成。请也许...)

版权声明:本文博主原创文章,博客,未经同意不得转载。

《数字图像处理原理与实践(MATLAB文本)》书代码Part7的更多相关文章

  1. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part6

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part6,辑录该书第281至第374页之代码,供有须要读者下载研究使用.代码运行结果请參见原书配图,建议下载代码前阅读下 ...

  2. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part2

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part2(P43~80),代码运行结果请參见原书配图,建议下载代码前阅读下文: 关于<数字图像处理原理与实践(MA ...

  3. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part1

    本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part1(P1~42).代码运行结果请參见原书配图. P20 I = imread('lena.jpg');BW1 = ...

  4. 《数字图像处理原理与实践(MATLAB版)》一书之代码Part5

    <数字图像处理原理与实践(MATLAB版)>一书之代码Part5 本文系<数字图像处理原理与实践(MATLAB版)>一书之代码系列的Part5.辑录该书第225至第280页之代 ...

  5. 数字图像处理原理与实践(MATLAB版)勘误表

    本文系<数字图像处理原理与实践(MATLAB版)>一书的勘误表. [内容简单介绍]本书全面系统地介绍了数字图像处理技术的理论与方法,内容涉及几何变换.灰度变换.图像增强.图像切割.图像去噪 ...

  6. Reading | 《数字图像处理原理与实践(MATLAB版)》(未完待续)

    目录 一.前言 1.MATLAB or C++ 2.图像文件 文件头 调色板 像素数据 3.RGB颜色空间 原理 坐标表示 4.MATLAB中的图像文件 图像类型 image()函数 imshow() ...

  7. FPGA经典:Verilog传奇与基于FPGA的数字图像处理原理及应用

    一 简述 最近恶补基础知识,借了<<Verilog传奇>>,<基于FPGA的嵌入式图像处理系统设计>和<<基千FPGA的数字图像处理原理及应用>& ...

  8. 初次接触《C++程序设计原理与实践》一书

    前两天读书日,买了些书回来看.__Bjarne Stroustrup__的<C++程序设计原理与实践>便是其中一本.其实也没看完,只看了第0章-致读者,大师不愧是大师,只看了一章就让心生共 ...

  9. MATLAB数字图像处理(一)基础操作和傅立叶变换

    数字图像处理是一门集计算机科学.光学.数学.物理学等多学科的综合科学.随着计算机科学的发展,数字图像处理技术取得了巨大的进展,呈现出强大的生命力,已经在多种领域取得了大量的应用,推动了社会的发展.其中 ...

随机推荐

  1. 函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网

    函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网 函数式编程很难,这正是你要学习它的原因 156 次分享 新浪微博 腾讯微博 Tweet 人人网 QQ空间 很奇怪不是,很少有人每天都使用函数 ...

  2. HDU 4814 Golden Radio Base 模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4814 题目大意: 把一个正整数表示为φ进制, φ = (1+√5)/2 . 且已知: 1. φ + 1 ...

  3. SQL Server Database 维护计划创建一个完整的备份策略

     SQL Server维护计划Maintenance Plan这是一个非常有用的维护工具,能够完成大部分的数据库维护任务,通过这些功能包.您可以省略大量的编码时间. 介绍的不是非常多,特此补上一篇 ...

  4. hdu3829(最大独立集)

    传送门:Cat VS Dog 题意:动物园有N只猫,M只狗,P个小孩.每个小孩都有自己喜欢的动物和讨厌的动物,如果他喜欢狗,那么就讨厌猫, 如果他讨厌狗,那么他就喜欢猫.某个小孩能开心,当且仅当他喜欢 ...

  5. Android开源项目pulltorefresh分析与简单使用

    在Android开发中有时我们须要訪问网络实时刷新数据.比方QQ好友在线状态最新信息,QQ空间须要显示很多其它的好友动态信息,EOE论坛client显示很多其它的文章帖子信息等.android-pul ...

  6. js:进一步关闭(范围:下一个)

    function fn1(){   //创建一个数组   var fns = new Array();   //i这个变量是保存在fn1这个作用域中   for(var i=0;i<10;i++ ...

  7. cocostudio内存释放

    在使用cocostudio时,在释放内存时能够这样做: 在onExit()方法里加入例如以下: void LoadLayer::onExit() { // 释放本对象自己 removeFromPare ...

  8. SVN基于Maven的Web项目更新,本地过程详细解释

    周围环境 MyEclipse:10.7 Maven:3.1.1 概要 最近在做项目,MyEclipse下载SVN基于上述Maven的Web问题,有时候搞了非常半天,Maven项目还是出现叉号,最后总结 ...

  9. SQL Server Insert操作中的锁

    原文:SQL Server Insert操作中的锁 这篇博文简单介绍一下在SQL Server中一条Insert语句中用到的锁. 准备数据 首先我们建立一张表Table_1,它有两列Id(bigint ...

  10. OCP读书笔记(18) - 空间管理

    OLTP 表压缩 压缩始终是非常占用CPU的过程,并且需要花费一定时间,通常,如果压缩数据,则数据必须解压缩后才能使用.虽然此要求在数据仓库环境中是可以接受的但在OLTP环境中可能无法接受 现在,在O ...