How do I flip (mirror image) an image?

618 Ansichten (letzte 30 Tage)
Colm
Colm am 5 Jul. 2011
Bearbeitet: Sachin Bisht am 16 Okt. 2019
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

Akzeptierte Antwort

Paulo Silva
Paulo Silva am 5 Jul. 2011
after the imrotate do
set(gca,'xdir','reverse')
Another example
I = imread('onion.png');
I2 = flipdim(I ,2); %# horizontal flip
I3 = flipdim(I ,1); %# vertical flip
I4 = flipdim(I3,2); %# horizontal+vertical flip
subplot(2,2,1), imshow(I)
subplot(2,2,2), imshow(I2)
subplot(2,2,3), imshow(I3)
subplot(2,2,4), imshow(I4)
  6 Kommentare
Bharath Lohray
Bharath Lohray am 8 Okt. 2015
Now deprecated. Use `flip` instead of `flipdim`
Sachin  Bisht
Sachin Bisht am 16 Okt. 2019
Bearbeitet: Sachin Bisht am 16 Okt. 2019
Can someone give me the implementation of mirroring for bitmap images?

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Goku
Goku am 8 Okt. 2017
Bearbeitet: Goku am 8 Okt. 2017
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
Thili Mahanama am 29 Apr. 2018
Bearbeitet: Image Analyst am 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 Kommentare
Image Analyst
Image Analyst am 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
Stephen23 am 25 Nov. 2018
Or just using basic indexing:
new = img(:,end:-1:1,:)

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Images finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by