我在MATLAB中遇到如下问题:
假设我有一个如下所示的矩阵.我想要做的是计算以黄色给出的像素的平均值.(ans是108)
如果给出的选项在外面,将计算这一点.
另一方面,如果选项是作为内部给出的,那么在图像中执行的操作.
**我想编写一个算法,根据手动设置的选项找出标有零的区域内外的平均值.**
****4邻里**或8邻居**可考虑.我想在MATLAB中计算它.你们能帮助我吗?
首先,创建图像
FirstImage = [ 108 113 121 129 128 124 117 101 114 76 60 110 98 74 121 109 114 62 52 105 85 59 121 116 110 59 54 104 0 0 0 115 104 55 54 104 0 0 0 113 96 48 51 105 0 0 0 113 94 60 69 115 0 0 0 110 99 108 122 130 135 0 0 109 ]; SecondImage = [ 0 0 0 0 0 0 138 137 137 137 0 0 138 127 129 135 138 0 132 97 99 133 135 0 134 108 110 137 137 0 141 140 140 140 139 0 138 138 138 140 0 0 0 0 0 0 0 0 ];
%使图像成为二进制并将其反转,使图像中的零为1.
%这是为了使其兼容bwtraceboundary
im = FirstImage == 0 ;
%找到符合要求的对象坐标 bwtraceboundary
objectCoord = find(im); [startRow,startCol] = ind2sub(size(im),objectCoord(1) );
%该find()
函数逐列扫描矩阵,
因此我们知道它将从左上角开始并
逐列地向下工作%.因此,边界的某些部分必须
位于找到的第一个坐标的东边.这是找到
%起始坐标的一种方法
contour = bwtraceboundary(im,[startRow startCol],'E' );
%标记轮廓
contourimage = zeros(size(im)); contourind = sub2ind(size(contourimage),contour(:,1),contour(:,2)) contourimage(contourind) = 1; contourimage = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0
%现在,这只会检测对象本身的边界.
%我们正在寻找最接近边界的非零值.
%若要获得最接近的非零值,
%将稀释应用于countour图像,
然后%将元素与原始图像相乘.
%计算非零值的平均值
%进行稀释
mask = bwmorph(contourimage,'dilate') mask = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1
%mask
与原始图像相乘,以元素为单位.
%对象本身将被清零,非零边界将保留.
A=mask.*FirstImage A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 85 59 121 116 0 0 0 104 0 0 0 115 0 0 0 104 0 0 0 113 0 0 0 105 0 0 0 113 0 0 0 115 0 0 0 110 0 0 0 130 135 0 0 109
%然后计算平均值
mean(A(A>0)) ans = 108.6875