File: SadowskiDemo.m

package info (click to toggle)
psychtoolbox-3 3.0.19.14.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 86,796 kB
  • sloc: ansic: 176,245; cpp: 20,103; objc: 5,393; sh: 2,753; python: 1,397; php: 384; makefile: 193; java: 113
file content (105 lines) | stat: -rw-r--r-- 2,925 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
function SadowskiDemo(imgName)
% SadowskiDemo([imgName]);
%
% Demonstrate Sadowski illusion on a specified image file 'imgName'. if
% 'imgName' is omitted, a default image is used.
%
% The demo will first show the color adaptation image. Please fixate the
% fixation cross in the center of the screen. Then press a key. The demo
% will show the grayscale only test image. Be amazed! Press any key to
% repeat the adaptation phase, press ESCape to quit the demo. If you press
% the left cursor key, a white test patch will be show instead of the
% luminance image.
%

% History:
% 17.03.2010  mk  Written. Inspired by a demo shown by Stuart Anstis.

% Check installation:
AssertOpenGL;

KbName('UnifyKeyNames')
escape = KbName('ESCAPE');
left = KbName('LeftArrow');

% Assign our cute rabbits if image filename omitted:
if nargin < 1
    imgName = [];
end

if isempty(imgName)
    imgName = [PsychtoolboxRoot 'PsychDemos/konijntjes1024x768.jpg'];
end

% Read image from filesystem:
img = imread(imgName);

% Convert RGB image to HSV color space for simpler manipulation:
hsv = rgb2hsv(img);

% Extract luminance channel for pure luma image:
luma = hsv(:,:,3) * 255;

% Open window with black background on secondary display:
screenid = max(Screen('Screens'));
[win, winrect] = Screen('OpenWindow', screenid, 0);
Screen('TextSize', win, 24);

HideCursor;

% Make luminance only texture:
lumatex = Screen('MakeTexture', win, luma);

% Compute destination rectangle for a 0.5 scaling:
rect = Screen('Rect', lumatex);
s1 = RectWidth(rect) / RectWidth(winrect);
s2 = RectHeight(rect) / RectHeight(winrect);
sf = min(1/s1, 1/s2) * 0.5;
rect = ScaleRect(rect, sf, sf);
dstRect = CenterRect(rect, winrect);

% "Rotate" hue values by 0.5 or 180 degrees for "anti-colors":
hsv(:,:,1) = mod(hsv(:,:,1) + 0.5, 1);

% MK: Modifying saturation not very effective. Leave untouched. hsv(:,:,2) = 1.0;

% Fix luminance to 50% peak - No luminance info in anti-color image:
hsv(:,:,3) = 0.5;

% Convert back from HSV to RGB space:
anticolors = hsv2rgb(hsv) * 255;

% Make a texture out of it:
antitex = Screen('MakeTexture', win, anticolors);

while 1
    % Display anti-color image, with a superimposed fixation cross:
    Screen('DrawTexture', win, antitex, [], dstRect);
    DrawFormattedText(win, '+', 'center', 'center', 0);
    Screen('Flip', win);

    % Wait for keystroke:
    [secs, keycode] = KbStrokeWait;
    if keycode(left)
        % Left arrow: Draw neutral white:
        Screen('FillRect', win, 255, dstRect);
    else
        % Other key: Draw luminance-only image:
        Screen('DrawTexture', win, lumatex, [], dstRect);
        DrawFormattedText(win, '+', 'center', 'center', 0);
    end
    Screen('Flip', win);

    % Wait for keystroke:
    [secs, keycode] = KbStrokeWait;
    % Escape exits:
    if keycode(escape)
        break;
    end
end

% Done. Close window and release all ressources:
ShowCursor;
sca;

return;