Introduction
The Open Source Computer Vision Library (OpenCV) offers freely available programming tools to handle visual input such as images or video files. It contains many ready-to-use functions, which can be accessed via different programming languages. The example I posted here uses python. Therefore, if you want to understand the code you need a basic knowledge of python and NumPy at least. If you're looking for an introduction to OpenCV, this link may be quite valuable: [https://dev.to/arpitmandliya/opencv-python-tutorial-3dac].
How pixels make an image
In most cases a computer image is based on the RGB (BGR in Opencv) model. This means that pixel colour is a mix of the components Red, Green and Blue. There are other models as well (e.g., Hue, Saturation and Value) and vector graphics (SVG or PDF) but I will not them explain them here.
An image on a computer can be depicted as a collection of pixels, which contain colour information. In more technical terms, an image is three- dimensional array (or a matrix of pixels with three colour channels) with the first two dimensions determining the size (height and width) of the image and the third dimension containing the values of red, green and blue (each colour with values between 0 to 255) . If an image has only one colour channel (8 bit image) it is grey-scale image with different values of grey ranging from 0 (black) to 255 (white). Figure 1 illustrates that.
Figure 1: Images are represented as arrays. On the right is an example of a colour image, where the values for Red, Green, and Blue range from 0 to 255 (0,0,255 is blue). On the left is a grayscale image with a single channel representing different shades of grey.
Turning colour information into different sized dots
The principles discussed above can be applied to perform image editing in Python using the NumPy and OpenCV libraries. In this example, I use loops to process an image represented as a NumPy array. The loop doesn't iterate over every pixel in the image but skips pixels at regular intervals ( e.g., it processes every 10th pixel). The grayscale value at each processed pixel is used to determine the size of a dot (e.g., a grayscale value of 100 corresponds to a specific dot size). These dots are then drawn on an empty copy of the original image, using the colour information from the original image. In summary, I create an image copy where dots of varying sizes are drawn based on the colour information of the original pixels (see Figure 2).
Figure 2: To draw a dot the colour information of a pixel in the original image is used. To determine the size of the dot the greyscale version of the original image is used.
Below you find the code and a possible outcome is shown in Figure 3.
import numpy as np import cv2 # load an image; image has to be in working directory when giving no path information img = cv2.imread('FlowerPower.jpg',cv2.IMREAD_UNCHANGED) # show the dimensions of the image array print(img.shape) # choose a resizing factor for the whole image; to depict it on computer screen resizing = .2 #convert original image to greyscale image img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # make a copy of the orignal image img_output = img.copy() # make a white canvas by assigning the color white (255,255, 255) to each pixel # [:,:] covers all values of the first and second array dimension img_output[:,:] = [255,255,255] # or with black [0,0,0] or any other color # Settings for looping over the image step_width = 40 # steps of loop; here: every 30th pixel # - 1 fills circle that is drawn onto output image; positive value define # line thickness of circle thickness = -1 perc = .2 # size factor for drawing circles/dots onto output image # for loops running over the first two dimensions of the array (width and height) # step_width defines which pixels are included for i in range(2, img.shape[0] - step_width, step_width): for u in range(2, img.shape[1] - step_width, step_width): # radius (dot size) is based on the value of greyscale version of original image # at the current index; e.g., pixel at i = 10, u = 30 might have 123 # perc variable modifies dot size radius = int((255-img_grey[i,u])*perc) +1 if radius <= 0: radius +=1 # take color from pixel at position [i,u] of original image # e.g., i = 10, u = 30 might have [123,0,61] color = img[i,u].astype(int).tolist() # draw a circle on output image using dot size based on greyscale # value with color of original image cv2.circle(img_output, (u,i), radius, color, thickness) # resize images, so they are not too big for computerscreen # based on the resizing variable defined at the top of the page img_size = img.shape img_sm = cv2.resize(img,(int(img_size[1]*resizing), int(img_size[0] * resizing)), interpolation = cv2.INTER_CUBIC) # open window that shows original image cv2.imshow("Original", img_sm) img_output_sm = cv2.resize(img_output,(int(img_size[1]*resizing), int(img_size[0]* resizing)), interpolation = cv2.INTER_CUBIC) # show the dotted image cv2.imshow("Dotted Image", img_output_sm)
Figure 3: On the right hand side the original image is shown and on the left hand side a dotted version based on the code presented here is shown.
I hope I presented the code in a comprehensive manner and that someone might find it useful. Play around with it, if you like to. Replace the circles by rectangles, select different sizes of circles, change the values in the step width of the loops etc. and see what happens.
The above is the detailed content of Making a simple pointillism painting using OpenCv.. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Python's unittest and pytest are two widely used testing frameworks that simplify the writing, organizing and running of automated tests. 1. Both support automatic discovery of test cases and provide a clear test structure: unittest defines tests by inheriting the TestCase class and starting with test\_; pytest is more concise, just need a function starting with test\_. 2. They all have built-in assertion support: unittest provides assertEqual, assertTrue and other methods, while pytest uses an enhanced assert statement to automatically display the failure details. 3. All have mechanisms for handling test preparation and cleaning: un

PythonisidealfordataanalysisduetoNumPyandPandas.1)NumPyexcelsatnumericalcomputationswithfast,multi-dimensionalarraysandvectorizedoperationslikenp.sqrt().2)PandashandlesstructureddatawithSeriesandDataFrames,supportingtaskslikeloading,cleaning,filterin

Dynamic programming (DP) optimizes the solution process by breaking down complex problems into simpler subproblems and storing their results to avoid repeated calculations. There are two main methods: 1. Top-down (memorization): recursively decompose the problem and use cache to store intermediate results; 2. Bottom-up (table): Iteratively build solutions from the basic situation. Suitable for scenarios where maximum/minimum values, optimal solutions or overlapping subproblems are required, such as Fibonacci sequences, backpacking problems, etc. In Python, it can be implemented through decorators or arrays, and attention should be paid to identifying recursive relationships, defining the benchmark situation, and optimizing the complexity of space.

To implement a custom iterator, you need to define the __iter__ and __next__ methods in the class. ① The __iter__ method returns the iterator object itself, usually self, to be compatible with iterative environments such as for loops; ② The __next__ method controls the value of each iteration, returns the next element in the sequence, and when there are no more items, StopIteration exception should be thrown; ③ The status must be tracked correctly and the termination conditions must be set to avoid infinite loops; ④ Complex logic such as file line filtering, and pay attention to resource cleaning and memory management; ⑤ For simple logic, you can consider using the generator function yield instead, but you need to choose a suitable method based on the specific scenario.

Future trends in Python include performance optimization, stronger type prompts, the rise of alternative runtimes, and the continued growth of the AI/ML field. First, CPython continues to optimize, improving performance through faster startup time, function call optimization and proposed integer operations; second, type prompts are deeply integrated into languages ??and toolchains to enhance code security and development experience; third, alternative runtimes such as PyScript and Nuitka provide new functions and performance advantages; finally, the fields of AI and data science continue to expand, and emerging libraries promote more efficient development and integration. These trends indicate that Python is constantly adapting to technological changes and maintaining its leading position.

Python's socket module is the basis of network programming, providing low-level network communication functions, suitable for building client and server applications. To set up a basic TCP server, you need to use socket.socket() to create objects, bind addresses and ports, call .listen() to listen for connections, and accept client connections through .accept(). To build a TCP client, you need to create a socket object and call .connect() to connect to the server, then use .sendall() to send data and .recv() to receive responses. To handle multiple clients, you can use 1. Threads: start a new thread every time you connect; 2. Asynchronous I/O: For example, the asyncio library can achieve non-blocking communication. Things to note

Polymorphism is a core concept in Python object-oriented programming, referring to "one interface, multiple implementations", allowing for unified processing of different types of objects. 1. Polymorphism is implemented through method rewriting. Subclasses can redefine parent class methods. For example, the spoke() method of Animal class has different implementations in Dog and Cat subclasses. 2. The practical uses of polymorphism include simplifying the code structure and enhancing scalability, such as calling the draw() method uniformly in the graphical drawing program, or handling the common behavior of different characters in game development. 3. Python implementation polymorphism needs to satisfy: the parent class defines a method, and the child class overrides the method, but does not require inheritance of the same parent class. As long as the object implements the same method, this is called the "duck type". 4. Things to note include the maintenance

The core answer to Python list slicing is to master the [start:end:step] syntax and understand its behavior. 1. The basic format of list slicing is list[start:end:step], where start is the starting index (included), end is the end index (not included), and step is the step size; 2. Omit start by default start from 0, omit end by default to the end, omit step by default to 1; 3. Use my_list[:n] to get the first n items, and use my_list[-n:] to get the last n items; 4. Use step to skip elements, such as my_list[::2] to get even digits, and negative step values ??can invert the list; 5. Common misunderstandings include the end index not
