效果:


步驟
1.引數設定及圖片匯入
可以只更改背景圖片其實
bkgPic=imread(‘test.jpg’);%圖片地址
lineDensity=0.6; %故障線條出現概率
lineLenRange=[50,80]; %故障線條長度范圍
greenMoveLen=10; %綠移距離
原始圖片:

2.圖片灰度化及紅藍背景構造
[m,n,k]=size(bkgPic);
if k~=1
bkgPic=rgb2gray(bkgPic);
end
matSize=[n,m];
vector=[1,0];
colorList=[21 27 143
68 22 113
94 72 151
175 152 192
221 188 204
217 156 174
203 82 104
232 31 37
151 5 11];
colorMat=vColorMat(matSize,vector,colorList);
blueRedPic=uint8(double(colorMat).*double(bkgPic)./200);
其中所需要的漸變圖建構式可以看這篇博客:
MATLAB 各類二維漸變圖
所用到的漸變圖建構式在這:
function colorMat=vColorMat(matSize,vector,colorList)
% matSize=[800,600];
% vector=[1,12];
% colorList=[195 53 93
% 211 102 141
% 231 179 192
% 229 182 172
% 227 178 137
% 238 191 147
% 236 195 113];
% colorMat=vColorMat(matSize,vector,colorList)
% imshow(colorMat)
vector=vector./norm(vector);
[xMesh,yMesh]=meshgrid(0:matSize(2)-1,0:matSize(1)-1);
zMesh=xMesh.*vector(2)+yMesh.*vector(1);
zMesh=(zMesh-min(min(zMesh)))./(max(max(zMesh))-min(min(zMesh)));
colorFunc=colorFuncFactory(colorList);
colorMesh=colorFunc(zMesh);
colorMat(:,:,1)=colorMesh(end:-1:1,1:matSize(1));
colorMat(:,:,2)=colorMesh(end:-1:1,matSize(1)+1:2*matSize(1));
colorMat(:,:,3)=colorMesh(end:-1:1,2*matSize(1)+1:3*matSize(1));
colorMat=uint8(colorMat);
function colorFunc=colorFuncFactory(colorList)
x=(0:size(colorList,1)-1)./(size(colorList,1)-1);
y1=colorList(:,1);y2=colorList(:,2);y3=colorList(:,3);
colorFunc=@(X)[interp1(x,y1,X,'linear')',interp1(x,y2,X,'linear')',interp1(x,y3,X,'linear')'];
end
end
紅藍漸變圖效果:
當然大家可以自己取色制作其他漸變

背景疊加效果:

3.綠移
將綠色通道向左側移動幾像素,為了方便起見就沒有在右側補充像素,因此綠移后的影像寬度會少幾個像素(有保留原影像大小需求的可以嘗試自行改寫我的代碼,只需要將影像兩側提前擴充好再進行像素移動即可)
Rchannel=blueRedPic(:,1+greenMoveLen:end,1);
Gchannel=blueRedPic(:,1:end-greenMoveLen,2);
Bchannel=blueRedPic(:,1+greenMoveLen:end,3);
gm_brPic(:,:,1)=Rchannel;
gm_brPic(:,:,2)=Gchannel;
gm_brPic(:,:,3)=Bchannel;
綠移效果:
可以看出人物主體出現了明顯綠色偏移

4.添加故障線條
先隨機抽取一定量不重復整數,在被抽中的行使用’motion’動態模糊濾波器,模糊長度由lineLenRange引數決定:
tempRand=rand(1,m);
[~,movePos]=sort(tempRand);
movePos=movePos(1:floor(m*lineDensity));
movePos=sort(movePos);
movePic=gm_brPic(movePos,:,1);
for i=1:size(movePic,1)
H = fspecial('motion',randi(lineLenRange,[1,1]),0);
movePic(i,:) = imfilter(movePic(i,:),H,'replicate');
end
gm_brPic(movePos,:,1)=movePic;
imshow(gm_brPic);
效果:




5.完整代碼
兩個m檔案:
BlueRed.m
function BlueRed
bkgPic=imread('test6.jpg');%圖片地址
lineDensity=0.6; %故障線條出現概率
lineLenRange=[50,80]; %故障線條長度范圍
greenMoveLen=10; %綠移距離
[m,n,k]=size(bkgPic);
if k~=1
bkgPic=rgb2gray(bkgPic);
end
matSize=[n,m];
vector=[1,0];
colorList=[21 27 143
68 22 113
94 72 151
175 152 192
221 188 204
217 156 174
203 82 104
232 31 37
151 5 11];
colorMat=vColorMat(matSize,vector,colorList);
blueRedPic=uint8(double(colorMat).*double(bkgPic)./200);
Rchannel=blueRedPic(:,1+greenMoveLen:end,1);
Gchannel=blueRedPic(:,1:end-greenMoveLen,2);
Bchannel=blueRedPic(:,1+greenMoveLen:end,3);
gm_brPic(:,:,1)=Rchannel;
gm_brPic(:,:,2)=Gchannel;
gm_brPic(:,:,3)=Bchannel;
tempRand=rand(1,m);
[~,movePos]=sort(tempRand);
movePos=movePos(1:floor(m*lineDensity));
movePos=sort(movePos);
movePic=gm_brPic(movePos,:,1);
for i=1:size(movePic,1)
H = fspecial('motion',randi(lineLenRange,[1,1]),0);
movePic(i,:) = imfilter(movePic(i,:),H,'replicate');
end
gm_brPic(movePos,:,1)=movePic;
imshow(gm_brPic);
end
vColorMat.m
function colorMat=vColorMat(matSize,vector,colorList)
% matSize=[800,600];
% vector=[1,12];
% colorList=[195 53 93
% 211 102 141
% 231 179 192
% 229 182 172
% 227 178 137
% 238 191 147
% 236 195 113];
% colorMat=vColorMat(matSize,vector,colorList)
% imshow(colorMat)
vector=vector./norm(vector);
[xMesh,yMesh]=meshgrid(0:matSize(2)-1,0:matSize(1)-1);
zMesh=xMesh.*vector(2)+yMesh.*vector(1);
zMesh=(zMesh-min(min(zMesh)))./(max(max(zMesh))-min(min(zMesh)));
colorFunc=colorFuncFactory(colorList);
colorMesh=colorFunc(zMesh);
colorMat(:,:,1)=colorMesh(end:-1:1,1:matSize(1));
colorMat(:,:,2)=colorMesh(end:-1:1,matSize(1)+1:2*matSize(1));
colorMat(:,:,3)=colorMesh(end:-1:1,2*matSize(1)+1:3*matSize(1));
colorMat=uint8(colorMat);
function colorFunc=colorFuncFactory(colorList)
x=(0:size(colorList,1)-1)./(size(colorList,1)-1);
y1=colorList(:,1);y2=colorList(:,2);y3=colorList(:,3);
colorFunc=@(X)[interp1(x,y1,X,'linear')',interp1(x,y2,X,'linear')',interp1(x,y3,X,'linear')'];
end
end
最前面提到的引數調整的不同會有不一樣的效果喲
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/282664.html
標籤:其他
下一篇:第二講:PN結與二極管的特性
