Recommended Daily Intake

Notes in about 1680 characters. Expect posts in pt-pt and en-us.

RSS

Archive


Screaming Venus

28-08-2025 [21:34]

This piece emerged from the challenge I was given at the time while I was working on a similar theme. The drawing was created by a machine, seeded from a digital collage of Botticelli's Venus and a still from Sergei Eisenstein's 1925 silent film 'The Battleship Potemkin', from which Francis Bacon copied the face of his screaming pope. The work allows us to see the copy on two levels: on one hand, the theme of Venus is perfectly visible, a literal copy; on the other, it refers to an induced copy of Bacon's work, thus extending the copy beyond the physical presence of the work presented to the mental copy we have of Bacon's infamous work.


Every 2d drawing is an abstraction

15-06-2026 [22:11]
... is a quote from Hockney.

We was obviously right.

In a different mind set, or not. Reverse engineering Bacon's portraits.

At times I wanted things to have, for a fleeting moment, a tiny, just tiny, instant of mystery. What is there to do...


Useful stuff

04-06-2026 [16:50]
... quotes and stuff

04/06/2026

I like the naive notion of assuming that the mark left by a pen plotter is merely a consequence of the artist's code. How much of the manufacturer's firmware is embedded within the art that the author claims as their own?


Simple python script for serial plotters

06-09-2025 [15:06]
... use it
#!/usr/bin/python3

import sys
import serial

if __name__ == "__main__":
    file = sys.argv[1]
    with open(file, 'r') as content_file:
        content = content_file.read()
        ser = serial.Serial('/dev/ttyUSB0', 9600, bytesize=8, parity='N', stopbits=serial.STOPBITS_TWO,
                        timeout=5, xonxoff=False, rtscts=True)
    ser.write(content.encode())
    ser.flush()
    ser.close()


News, good

27-08-2025 [12:17]
The last few weeks have been special.

I was able to solve some computational problems that were contaminating the algorithm's speed. I improved the calculation speed by a big factor using a faster convolution algorithm and a hack to the Gabor filter kernel with a q-Gaussian which enables shading and region detection (see example below).

The use of a mathematical model for the receptive fields of the neural visual cortex showed more potential than what had originally inspired my work. I'm using a pre-trained-by-nature GNN (G stands for Gabor).

Simple receptive fields have Gabor shapes, but not all Gabor shapes are receptive fields.

After some research and experiments I came to the conclusion that it was feasible to design a computational-robotic system, capable of automatic drawing. In my practice I started producing various experimental drawings with pen plotters and algorithms and found that it seems possible to refine this approach by better understanding the possibilities of the algorithmic modification of images and its embodiment, and linking this approach with a breakdown of the artist's way of working.

This opens new ways to better understand how drawing, and how (self)depiction is perceived, how variations of styles, procedures, algorithms can be used to explore the reciprocity of the artist (self)perception and (self) image over time.


Still life

25-08-2025 [23:28]
...

Still life was never a subject until there was nothing else left to draw, then you get it.


Ballpoint art

24-08-2025 [22:52]
...more than doodling.

And more.


Simple receptive fields have Gabor shapes, but not all Gabor shapes are receptive fields.

23-08-2025 [20:39]
... obviously

There's a funny argument that follows from my claim that I don't use AI to generate my drawings, if I'm using a mathematical model for the receptive fields of the neural visual cortex, then, formally, I'm using a pre-trained by nature GNN.

Also, simple receptive fields have Gabor shapes, but not all Gabor shapes are receptive fields.


Convolute

13-08-2025 [16:26]

Making convolutions great (fast) again.

My drawing algorithm relies heavily on making convolutions with large kernel filters for feature extraction, so finding a faster algorithm for this process significantly improved speed and provided an additional set of parameters to work with. :D


Anisotropic Diffusion example

06-08-2025 [10:43]
Wondering why does almost all AI generated art or images looks 'the same'...

Always wondering why does almost all AI generated art or images looks "the same", that is, aesthetically equivalent. In a way all neural networks do a anisotropic diffusion on images.

Some refs:

Kovesi's works nicely, and we have some parameters to play with :D

% ANISODIFF - Anisotropic diffusion.
%
% Usage:
%  diff = anisodiff(im, niter, kappa, lambda, option)
%
% Arguments:
%         im     - input image
%         niter  - number of iterations.
%         kappa  - conduction coefficient 20-100 ?
%         lambda - max value of .25 for stability
%         option - 1 Perona Malik diffusion equation No 1
%                  2 Perona Malik diffusion equation No 2
%
% Returns:
%         diff   - diffused image.
%
% kappa controls conduction as a function of gradient.  If kappa is low
% small intensity gradients are able to block conduction and hence diffusion
% across step edges.  A large value reduces the influence of intensity
% gradients on conduction.
%
% lambda controls speed of diffusion (you usually want it at a maximum of
% 0.25)
%
% Diffusion equation 1 favours high contrast edges over low contrast ones.
% Diffusion equation 2 favours wide regions over smaller ones.

% Reference: 
% P. Perona and J. Malik. 
% Scale-space and edge detection using ansotropic diffusion.
% IEEE Transactions on Pattern Analysis and Machine Intelligence, 
% 12(7):629-639, July 1990.
%
% Peter Kovesi  
% www.peterkovesi.com/matlabfns/
%
% June 2000  original version.       
% March 2002 corrected diffusion eqn No 2.

function diff = anisodiff(im, niter, kappa, lambda, option)

if ndims(im)==3
  error('Anisodiff only operates on 2D grey-scale images');
end

im = double(im);
[rows,cols] = size(im);
diff = im;
  
for i = 1:niter
%  fprintf('\rIteration %d',i);

  % Construct diffl which is the same as diff but
  % has an extra padding of zeros around it.
  diffl = zeros(rows+2, cols+2);
  diffl(2:rows+1, 2:cols+1) = diff;

  % North, South, East and West differences
  deltaN = diffl(1:rows,2:cols+1)   - diff;
  deltaS = diffl(3:rows+2,2:cols+1) - diff;
  deltaE = diffl(2:rows+1,3:cols+2) - diff;
  deltaW = diffl(2:rows+1,1:cols)   - diff;

  % Conduction

  if (option == 1)
    cN = exp(-(deltaN/kappa).^2);
    cS = exp(-(deltaS/kappa).^2);
    cE = exp(-(deltaE/kappa).^2);
    cW = exp(-(deltaW/kappa).^2);
  elseif (option == 2)
    cN = 1./(1 + (deltaN/kappa).^2);
    cS = 1./(1 + (deltaS/kappa).^2);
    cE = 1./(1 + (deltaE/kappa).^2);
    cW = 1./(1 + (deltaW/kappa).^2);
  end

  diff = diff + lambda*(cN.*deltaN + cS.*deltaS + cE.*deltaE + cW.*deltaW);

%  Uncomment the following to see a progression of images
%  subplot(ceil(sqrt(niter)),ceil(sqrt(niter)), i)
%  imagesc(diff), colormap(gray), axis image

end
%fprintf('\n');


Here's an example (regular (left), diffused (right):

and code

im=imread("vangogh.png");
im=rgb2gray(im);
jm=uint8(anisodiff(im, 20, 100, .25, 1));

imwrite(jm,"ad-vgogh.png")

Criado/Created: 2024 (created)

Última actualização/Last updated: 28-06-2026 [00:38]


Back...


For attribution, please cite this page as:

Charters, T., "Recommended Daily Intake": https://blog.nexp.pt/index.html (28-06-2026 [00:38])


(cc-by-sa) Tiago Charters - tiagocharters@nexp.pt