思路
希望参考matlab里的内置comet()函数实现一个图像的动态效果
参考图片如下
1.将图像二值化并提取边缘。
2.生成底图(形成特效的颜色)。
在这个动态效果中,每一个被激活的点在那一瞬间被赋予底图对应点的颜色。在之后每一轮对RGB图层乘以k(k<1)形成不断变暗的效果。
3.用mode1&2两种方式搜索最左侧点。
在mode1中,当一个点(一段垂直的线)左侧没有相邻的白点时,判断这个点(线的中点)为左侧点。
在mode2中,当一个点(一段垂直的线)是某个联通的环中x坐标最小的时,判断这个点(线的中点)为左侧点。
4.依次激活最左侧点。
每个被激活的点会去激活与它相邻的点以及在它左侧的左侧点。
5.生成gif效果图。
最后形成一定的延时。
实现
理论知识
OTSU算法
当取最佳阈值时,背景应该与前景差别最大,OTSU以类间方差为衡量标准。
数学形态学运算
轮廓提取:对于二值图像,当一个非零的点连接至少一个零点的时候它是轮廓点。(或者可以通过膨胀/腐蚀之后与原图取差。这里相对比较灵活,如果没有经过去噪处理可以考虑通过填充孤立的黑点/去除孤立的白点来进一步处理图像)
自带函数
预处理
%%pretreatment 预处理
I=imread(in);
I=rgb2gray(I); %transform RGB to Gray 将RGB转为灰度
thresh = graythresh(I); %自动确定二值化阈值
I2 = im2bw(I,thresh); %对图像二值化
BW2 = bwperim(I2); %查找边缘
编写函数
查找左侧点
findleft(findleft2):用mode1(mode2)查找最左侧点
function [ T ] = findleft2( BW2 )
%FINDLEFT1 查找最左侧点
%二值图像BW2 返回行为2的矩阵T 每一列代表一个点
M_dim=size(BW2);
%%查找最左侧点
T=[];
temp=[];
for i=4:M_dim(2)-4
index=0;
for j=4:M_dim(1)-4 %%search the i th column
if (BW2(j,i)==1)
if 4==i
T=[T,[j,i]'];%%add point (j,i)
temp=[temp,[j,i]'];
else
index=index+1;
if (BW2(j-1,i)+BW2(j+1,i)+BW2(j-1,i-1)+BW2(j,i-1)+BW2(