Arnolds cat map like scrambling
5 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
george korris
il 30 Ott 2021
Modificato: yanqi liu
il 9 Nov 2021
Hello to everybody!
Does anyone know how can you use any dynamical system to scramble an image just like you would do with arnolds cat map?
For example how would you do it for the standard map:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/784598/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/784603/image.png)
2 Commenti
Image Analyst
il 31 Ott 2021
I've posted my Arnolds cat map here before, which you've probably found. For your formula, I'm not sure what p, K, and theta represent. Do you have an image with 2-dimensions? Your formulas here seem to refer to 1-D signals.
Risposta accettata
Image Analyst
il 6 Nov 2021
Modificato: Image Analyst
il 6 Nov 2021
George, I've tried to use your sin() formula to apply it to an image and this is what I get. I have no idea what K should be though. For every pixel in the input image, I compute p as the radius from the center of the image, and theta as the angle. Then I put them into your formula to get the next p and theta, and I send the input pixel to that location in the output image.
% Demo by Image Analyst.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clearvars;
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 16;
numberOfIterations = 1200;
K = 1.3;
p = ones(numberOfIterations, 1);
theta = zeros(numberOfIterations, 1);
plotColors = jet(numberOfIterations);
originalImage = imread('peppers.png');
outputImage = zeros(size(originalImage), 'uint8');
[rows, columns, numberOfColorchannels] = size(originalImage)
for col = 1 : columns
fprintf('Column %d of %d.\n', col, columns)
for row = 1 : rows
% Find initial p and theta for this pixel.
p1 = sqrt((row-rows/2).^2 + (col-columns/2).^2);
theta1 = atan((row-rows/2)/(col-columns/2));
% Find next p and theta for this pixel.
% Where are we going to send this pixel to?
% Compute new p according to the formula.
p2 = p1 + K * sin(theta1);
% Compute new theta according to the formula.
theta2 = theta1 + p1;
% Make them mod 2 * pi
p2 = mod(p2, 2*pi);
theta2 = mod(theta2, 2*pi);
% Convert from polar to cartesian coordinates.
row2 = round(p2 * sin(theta2) + rows/2);
col2 = round(p2 * cos(theta2) + columns/2);
if isnan(row2) || isnan(col2)
continue;
end
% Skip it if it's outside the image.
if row2 <= 1 || row2 > rows || col2 <= 1 || col2 > columns
continue
end
outputImage(row2, col2, :) = originalImage(row, col, :);
end
end
% Display output image
imshow(outputImage)
title('Complete Chaos!', 'FontSize', fontSize);
axis('on', 'image');
impixelinfo
3 Commenti
Image Analyst
il 8 Nov 2021
Yes. I just used the formula. Not sure what you're using for K. It looks like you'll need to adapt the code if you want to have the output image be larger. Probably need a scaling factor in there somewhere, but I didn't have time and I figured you could research that since it's your problem.
Più risposte (4)
Image Analyst
il 31 Ott 2021
@george korris I don't really know since chaos is not my field. I know that some of the mini-hack image entries are using chaos so you might check out the code there:
yanqi liu
il 1 Nov 2021
Modificato: yanqi liu
il 9 Nov 2021
sir,may be use some logistics or chaos to generate some location change
5 Commenti
Image Analyst
il 1 Nov 2021
OK, but do you have anything that does the chaos thing with the sin() function like he asked in the original post?
Image Analyst
il 2 Nov 2021
George, try this:
% Demo by Image Analyst.
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clearvars;
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 16;
numberOfIterations = 1200;
K = 1.3;
p = ones(numberOfIterations, 1);
theta = zeros(numberOfIterations, 1);
plotColors = jet(numberOfIterations);
for n = 1 : numberOfIterations-1
% Compute new p according to the formula.
p(n+1) = p(n) + K * sin(theta(n));
% Compute new theta according to the formula.
theta(n+1) = theta(n) + p(n+1);
% Make them mod 2 * pi
p(n+1) = mod(p(n+1), 2*pi);
theta(n+1) = mod(theta(n+1), 2*pi);
% Plot it
plot([p(n), p(n+1)], [theta(n), theta(n+1)], '-', 'Color',plotColors(n, :));
hold on;
end
% Plot it.
% plot(theta, p, 'b-');
grid on;
title('Complete Chaos!', 'FontSize', fontSize);
ylabel('p', 'FontSize', fontSize);
xlabel('theta', 'FontSize', fontSize);
xticks(0 : pi/4 : 2*pi)
xlim([0, 2*pi])
ylim([0, 2*pi])
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/786715/image.png)
5 Commenti
Image Analyst
il 3 Nov 2021
@george korris do you mean you want to burn those lines into a digital image instead of being lines on a graph? If so, I'd need more info, like what resolution of image do you want. Do you want the lines to be colored? If so, how? And how many lines should be drawn etc. Just imagine I asked you to do it. What questions would you have for me? Well I have the same questions for you.
Vedere anche
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!