How do I flip (mirror image) an image?
Afficher commentaires plus anciens
I have an image which is being loaded upside-down and mirrored. So using imrotate, 180 I can have the image the right way around but still mirrored. What function would undo this mirroring?
Thanks
classdef ROITool < hgsetget
properties(GetAccess=public, SetAccess=private)
FigHandle
ImageControl
ScaledImage
ImSize
ROI
nROI
MaxnROIS=100
ToolBar
ToolBarItems
ToolBarSates={'circle','square','ellips','rectangle','line','delete','off'}
ToolBarImages={'Circle.png','Square.png','Ellips.png','Rectangle.png','line.png','Delete.png','MouseCursor.png'};
ROIColors={'blue','green','red','cyan','magenta','yellow'}
end
properties (Dependent = true, GetAccess=public, SetAccess = public)
SelectedType
end
methods
function obj=ROITool(ImageM)
if nargin==0
File='liveimage.jpg';
ImageM=double(imread(File));
ImageM = sum(ImageM, 3) / 3;
end
%Rescale Image
ImageM=double(ImageM);
Rescale=[min(ImageM(:)) max(ImageM(:))-min(ImageM(:))];
obj.ScaledImage=(ImageM-Rescale(1))./Rescale(2);
obj.DrawGUI;
set(obj.ImageControl.imageh, 'UserData',Rescale);
obj.ImageControl.update(obj.ScaledImage');
obj.nROI=0;
X=get(obj.ImageControl.imageh,'XData');
Y=get(obj.ImageControl.imageh,'YData');
obj.ImSize=[X(2) Y(2)];
set(obj.ImageControl.imageh,'ButtonDownFcn',{@obj.Buttondown});
obj.SelectedType='off';
end
function obj=Buttondown(obj,handle,~)
if handle~=obj.ImageControl.imageh;return;end
Mode=obj.SelectedType;
cp=get(obj.ImageControl.axesh,'Currentpoint');
MouseDownPosition=[cp(1,1) cp(1,2)];
switch lower(Mode)
case obj.ToolBarSates(5)
obj.AddLine(MouseDownPosition);
case obj.ToolBarSates(1:4)
obj.AddROI(MouseDownPosition,Mode);
end
end
function obj=AddLine(obj,StartPoint)
if obj.nROI>=obj.MaxnROIS;return;end
obj.nROI=obj.nROI+1;
color=obj.ROIColors{mod(obj.nROI,length(obj.ROIColors))+1};
obj.ROI{obj.nROI}=LineProfile(obj.ImSize,StartPoint,color,obj.nROI,obj.ImageControl.axesh);
addlistener(obj.ROI{obj.nROI},'DestroyObject',@obj.DeleteROI);
obj.SelectedType='off';
end
function obj=AddROI(obj,centerpoint,Type,radius)
if obj.nROI>=obj.MaxnROIS;return;end
if nargin==3;radius=[1 1];end
obj.nROI=obj.nROI+1;
color=obj.ROIColors{mod(obj.nROI,length(obj.ROIColors))+1};
obj.ROI{obj.nROI}=Roi(obj.ImSize,centerpoint,Type,radius,color,obj.nROI,obj.ImageControl.axesh);
addlistener(obj.ROI{obj.nROI},'DestroyObject',@obj.DeleteROI);
obj.SelectedType='off';
end
function obj=DeleteROI(obj,~,data)
obj.nROI=obj.nROI-1;
for i=data.ROINumber:obj.nROI
obj.ROI{i}=obj.ROI{i+1};
obj.ROI{i}.Number=i;
end
obj.SelectedType='off';
end
function SType=get.SelectedType(obj)
for i=1:length(obj.ToolBarSates)
State=get(obj.ToolBarItems(i),'State');
if strcmpi(State,'on');SType=obj.ToolBarSates{i};end
end
end
function set.SelectedType(obj,SType)
I=find(strcmpi(obj.ToolBarSates,SType));
if I>length(obj.ToolBarItems);return;end
State=get(obj.ToolBarItems(I),'State');
if strcmpi(State,'off') %prevent recursion
TempCallback=get(obj.ToolBarItems(I),'OnCallback');
set(obj.ToolBarItems(I),'OnCallback','');
set(obj.ToolBarItems(I),'State','on');
set(obj.ToolBarItems(I),'OnCallback',TempCallback);
end
for i=1:length(obj.ToolBarSates)
if i~=I;set(obj.ToolBarItems(i),'State','off');end
end
if strcmpi(SType,'delete');DeleteFlag=true;else DeleteFlag=false;end
for i=1:obj.nROI
obj.ROI{i}.DeleteOnClick=DeleteFlag;
end
end
function obj=SelectDrawMode(obj,~,~,index)
obj.SelectedType=obj.ToolBarSates{index};
end
function obj=DrawGUI(obj)
Position=[100 50 700 650];
obj.FigHandle=figure('Position',Position,'ToolBar','none','MenuBar','none','NumberTitle', 'off','Name','ROI and Line Profile Tool for 2D Images');
obj.ToolBar=uitoolbar;
obj.ImageControl=imagebox(obj.FigHandle,[50 100 600 500]);
for i=1:length(obj.ToolBarSates)
im=imread(obj.ToolBarImages{i});
obj.ToolBarItems(i)=uitoggletool('CData',im,'TooltipString',obj.ToolBarSates{i},'OnCallback',{@obj.SelectDrawMode,i});
end
end
end
end
Réponse acceptée
Plus de réponses (2)
To mirror flip an "Image_Original" you can just use flip or rotate and transpose the image :
Image_Flip = flip(Image_Original,2);
Image_Flip = imrotate(Image_Original,90)';
Thili Mahanama
le 29 Avr 2018
Modifié(e) : Image Analyst
le 25 Nov 2018
From scratch, for a gray scale image
% img=zeros(100,100); % img(50:75,20:35)=1; % img(10:20,10:20)=1;
img=imread('cameraman.tif')
subplot(1,2,1)
imshow(img)
[r,c]=size(img);
imgthili=zeros(100,100);
for i=1:r
for u=1:c
if (img(i,u)>=1 )
imgthili(i,c+1-u)=img(i,u);
else
imgthili(i,c+1-u)=img(i,u);
end
end
end
subplot(1,2,2)
intth=uint8(imgthili);
imshow(intth)
3 commentaires
Aditi Vedalankar
le 25 Nov 2018
Thank Paulo..
It worked..
Regards
Aditi
Image Analyst
le 25 Nov 2018
Yes, but it's not the way you'd do it - with a double for loop. You'd simply do
flippedImage = fliplr(grayImage);
It does the same thing, but more efficiently using a built-in function.
Stephen23
le 25 Nov 2018
Or just using basic indexing:
new = img(:,end:-1:1,:)
Catégories
En savoir plus sur Image Segmentation dans Centre d'aide et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!