Быстрые алгоритмы, позволяющие реализовать сдвиг влево при XOR-коррекции каждого цвета изображения RGB - PullRequest
0 голосов
/ 06 апреля 2011

Я хочу XOR для каждого бита изображения RGB после преобразования его в двоичный (в пиксельном цвете) с помощью функции dec2bin().Во-первых, я объявил массив scr(8)=0, содержащий все нули, и теперь я хочу, чтобы, когда ar(1)=xor(scr(1),pic(1)) был сделан, он хранился в scr(8)=ar(1), scr(7)=scr(8), scr(8)=ar(1) и так далее до конца,Я написал код, но это занимает много времени для обработки.Если вы знаете способ ускорить код, пожалуйста, помогите мне.Я застрял здесь и у меня впереди финальные презентации.

Это мой код:

pic=imread('peppers.png');
[imr,imc,clr]=size(pic);
scr(8)=0;
i=8;
img2=pic;
pic2(8)=0;
pic1(8)=0;
for row=1:imr;

    for col=1:imc

        for k=1:clr  

           img2(row,col,k)=bitxor(pic(row,col,k),66);
           pic1=dec2bin(img2(row,col,k),8);
           for n=1:8
           pic2(n)=xor(pic1(n),scr(n));
           if n==1
              scr(i)=pic2(n);
           end
           if n==2
              scr(i-1)=scr(i);
               scr(i)=pic2(n);
               end
               if n==3
                scr(i-2)=scr(i-1);
                scr(i-1)=scr(i);   
                scr(i)=pic2(n);
               end
               if n==4

                scr(i-3)=scr(i-2);
                scr(i-2)=scr(i-1);
                scr(i-1)=scr(i);   
                scr(i)=pic2(n);
               end
               if n==5
                 scr(i-4)=scr(i-3);  
                 scr(i-3)=scr(i-2);  
                scr(i-2)=scr(i-1);
                scr(i-1)=scr(i);
                 scr(i)=pic2(n);
               end
                if n==6
                scr(i-5)=scr(i-4);   
                scr(i-4)=scr(i-3); 
                scr(i-3)=scr(i-2);
                scr(i-2)=scr(i-1);
                scr(i-1)=scr(i);  
                 scr(i)=pic2(n);
                end
                if n==7
                scr(i-6)=scr(i-5);    
                scr(i-5)=scr(i-4); 
                scr(i-4)=scr(i-3);
                scr(i-3)=scr(i-2);
                scr(i-2)=scr(i-1);
                scr(i-1)=scr(i); 
                scr(i)=pic2(n);
                end
                if n==8
                 scr(i-7)=scr(i-6);        
                 scr(i-6)=scr(i-5);  
                scr(i-5)=scr(i-4);
                scr(i-4)=scr(i-3);
                scr(i-3)=scr(i-2);
                scr(i-2)=scr(i-1);
                scr(i-1)=scr(i);
                scr(i)=pic2(n);
                end

           end
           pic3=int2str(pic2);
           img2(row,col,k)=bin2dec(pic3);


        end

     end
end


imwrite(img2,'peppers2.png');
imshow('peppers2.png');

1 Ответ

2 голосов
/ 06 апреля 2011

Может быть, я что-то здесь упускаю, но почему бы вам не использовать встроенный BITSHIFT ? Кроме того, поскольку BITXOR работает на uint8, вы можете заменить свою функцию на

pic=imread('peppers.png');
pic2 = bitxor(pic,uint8(66)); %# xor with 66
pic2 = bitshift(pic2,1); %# shift to the left by one
...