multicloud365
  • Home
  • Cloud Architecture
    • OCI
    • GCP
    • Azure
    • AWS
    • IAC
    • Cloud Networking
    • Cloud Trends and Innovations
    • Cloud Security
    • Cloud Platforms
  • Data Management
  • DevOps and Automation
    • Tutorials and How-Tos
  • Case Studies and Industry Insights
    • AI and Machine Learning in the Cloud
No Result
View All Result
  • Home
  • Cloud Architecture
    • OCI
    • GCP
    • Azure
    • AWS
    • IAC
    • Cloud Networking
    • Cloud Trends and Innovations
    • Cloud Security
    • Cloud Platforms
  • Data Management
  • DevOps and Automation
    • Tutorials and How-Tos
  • Case Studies and Industry Insights
    • AI and Machine Learning in the Cloud
No Result
View All Result
multicloud365
No Result
View All Result

From RGB to HSV — and Again Once more

admin by admin
May 7, 2025
in AI and Machine Learning in the Cloud
0
From RGB to HSV — and Again Once more
399
SHARES
2.3k
VIEWS
Share on FacebookShare on Twitter


A elementary idea in Laptop Imaginative and prescient is knowing how photos are saved and represented. On disk, picture recordsdata are encoded in varied methods, from lossy, compressed JPEG recordsdata to lossless PNG recordsdata. When you load a picture right into a program and decode it from the respective file format, it can most certainly have an array-like construction that represents the pixels within the picture.

RGB

Every pixel accommodates some shade info about that particular level within the picture. Now the commonest strategy to symbolize this shade is within the RGB area, the place every pixel has three values: pink, inexperienced and blue. These values describe how a lot of every shade is current and they are going to be blended additively. So for instance, a picture with all values set to zero shall be black. If all three values are set to 100%, the ensuing picture shall be white.

Generally the order of those shade channels may be swapped. One other widespread order is BGR, so the order is reversed. That is generally utilized in OpenCV and the default when studying or displaying photos.

Alpha Channel

Pictures may include details about transparency. In that case, an extra alpha channel is current (RGBA). The alpha worth signifies the opacity of every pixel: an alpha of zero means the pixel is absolutely clear and a price of 100% represents a totally opaque pixel.

HSV

Now RGB(A) will not be the one strategy to symbolize colours. Actually there are numerous totally different shade fashions that symbolize shade. Some of the helpful fashions is the HSV mannequin. On this mannequin, every shade is represented by a hue, saturation and worth property. The hue describes the tone of shade, no matter brightness and saturation. Generally that is represented on a circle with values between 0 and 360 or 0 to 180, or just between 0 and 100%. Importantly, it’s cyclical, which means the values wrap round. The second property, the saturation describes how intense a shade tone is, so a saturation of 0 ends in grey colours. Lastly the worth property describes the brightness of the colour, so a brightness of 0% is all the time black.

Now this shade mannequin is extraordinarily useful in picture processing, because it permits us to decouple the colour tone from the saturation and brightness, which is inconceivable to do straight in RGB. For instance, if you’d like a transition between two colours and maintain the identical brightness through the full transition, this shall be very complicated to realize utilizing the RGB shade mannequin, whereas within the HSV mannequin that is easy by simply interpolating the hue.

Sensible Examples

We are going to take a look at three examples of the way to work with these shade areas in Python utilizing OpenCV. Within the first instance, we extract components of a picture which are of a sure shade. Within the second half, we create a utility perform to transform colours between the colour areas. Lastly, within the third software, we create a steady animation between two colours with fixed brightness and saturation.

1 – Shade Masks

The objective of this half is to discover a masks that isolates colours primarily based on their hue in a picture. Within the following image, there are totally different coloured paper items that we need to separate.

colored paper pieces

Utilizing OpenCV, we will load the picture and convert it to the HSV shade area. By default photos are learn in BGR format, therefore we want the flag cv2.COLOR_BGR2HSV within the conversion:

Python">import cv2

img_bgr = cv2.imread("photos/notes.png")
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)

Now on the HSV picture we will apply a shade filter utilizing the cv2.inRange perform to specify a decrease and higher certain for every property (hue, saturation, worth). With some experimentation I arrived on the following values for the filter:

Property Decrease Certain Higher Certain
Hue 90 110
Saturation 60 100
Worth 150 200
masks = cv2.inRange(
    src=img_hsv,
    lowerb=np.array([90, 60, 150]),
    upperb=np.array([110, 100, 200]),
)

The hue filter right here is constrained between 90 and 110, which corresponds to the sunshine blue paper on the backside of the picture. We additionally set a variety of the saturation and the brightness worth to get a fairly correct masks.

To indicate the outcomes, we first have to convert the single-channel masks again to a BGR picture form with 3 channels. Moreover, we will additionally apply the masks to the unique picture and visualize the end result.

mask_bgr = cv2.cvtColor(masks, cv2.COLOR_GRAY2BGR)
img_bgr_masked = cv2.bitwise_and(img_bgr, img_bgr, masks=masks)

composite = cv2.hconcat([img_bgr, mask_bgr, img_bgr_masked])
cv2.imshow("Composite", composite)

By altering the hue vary, we will additionally isolate different items. For instance for the purple paper, we will specify the next vary:

Property Decrease Certain Higher Certain
Hue 160 175
Saturation 80 110
Worth 170 210

2 – Shade Conversion

Whereas OpenCV supplies a helpful perform to transform full photos between shade areas, it doesn’t present an out-of-the-box answer to transform single colours between shade areas. We will write a easy wrapper that creates a small 1×1 pixel picture with an enter shade, makes use of the built-in OpenCV perform to transform to a different shade area and extract the colour of this single pixel once more.

def convert_color_space(enter: tuple[int, int, int], mode: int) -> tuple[int, int, int]:
    """
    Converts between shade areas

    Args:
        enter: A tuple representing the colour in any shade area (e.g., RGB or HSV).
        mode: The conversion mode (e.g., cv2.COLOR_RGB2HSV or cv2.COLOR_HSV2RGB).

    Returns:
        A tuple representing the colour within the goal shade area.
    """
    px_img_hsv = np.array([[input]], dtype=np.uint8)
    px_img_bgr = cv2.cvtColor(px_img_hsv, mode)
    b, g, r = px_img_bgr[0][0]
    return int(b), int(g), int(r)

Now we will take a look at the perform with any shade. We will confirm that if we convert from RGB -> HSV -> RGB again to the unique format, we get the identical values.

red_rgb = (200, 120, 0)

red_hsv = convert_color_space(red_rgb, cv2.COLOR_RGB2HSV)
red_bgr = convert_color_space(red_rgb, cv2.COLOR_RGB2BGR)
red_rgb_back = convert_color_space(red_hsv, cv2.COLOR_HSV2RGB)

print(f"{red_rgb=}") # (200, 120, 0)
print(f"{red_hsv=}") # (18, 255, 200)
print(f"{red_bgr=}") # (0, 120, 200)
print(f"{red_rgb_back=}") # (200, 120, 0)

3 – Steady Shade Transition

On this third instance, we’ll create a transition between two colours with a relentless brightness and saturation interpolation. This shall be in comparison with a direct interpolation between the preliminary and remaining RGB values.

def interpolate_color_rgb(
    start_rgb: tuple[int, int, int], end_rgb: tuple[int, int, int], t: float
) -> tuple[int, int, int]:
    """
    Interpolates between two colours in RGB shade area.
    Args:
        start_rgb: The beginning shade in RGB format.
        end_rgb: The ending shade in RGB format.
        t: A float between 0 and 1 representing the interpolation issue.
    Returns:
        The interpolated shade in RGB format.
    """
    return (
        int(start_rgb[0] + (end_rgb[0] - start_rgb[0]) * t),
        int(start_rgb[1] + (end_rgb[1] - start_rgb[1]) * t),
        int(start_rgb[2] + (end_rgb[2] - start_rgb[2]) * t),
    )


def interpolate_color_hsv(
    start_rgb: tuple[int, int, int], end_rgb: tuple[int, int, int], t: float
) -> tuple[int, int, int]:
    """
    Interpolates between two colours in HSV shade area.
    Args:
        start_rgb: The beginning shade in RGB format.
        end_rgb: The ending shade in RGB format.
        t: A float between 0 and 1 representing the interpolation issue.
    Returns:
        The interpolated shade in RGB format.
    """
    start_hsv = convert_color_space(start_rgb, cv2.COLOR_RGB2HSV)
    end_hsv = convert_color_space(end_rgb, cv2.COLOR_RGB2HSV)

    hue = int(start_hsv[0] + (end_hsv[0] - start_hsv[0]) * t)
    saturation = int(start_hsv[1] + (end_hsv[1] - start_hsv[1]) * t)
    worth = int(start_hsv[2] + (end_hsv[2] - start_hsv[2]) * t)

    return convert_color_space((hue, saturation, worth), cv2.COLOR_HSV2RGB)

Now we will write a loop to match these two interpolation strategies. To create the picture, we use the np.full methodology to fill all pixels of the picture array with a specified shade. Utilizing cv2.hconcat we will mix the 2 photos horizontally into one picture. Earlier than we show them, we have to convert to the OpenCV format BGR.

def run_transition_loop(
    color_start_rgb: tuple[int, int, int],
    color_end_rgb: tuple[int, int, int],
    fps: int,
    time_duration_secs: float,
    image_size: tuple[int, int],
) -> None:
    """
    Runs the colour transition loop.

    Args:
        color_start_rgb: The beginning shade in RGB format.
        color_end_rgb: The ending shade in RGB format.
        time_steps: The variety of time steps for the transition.
        time_duration_secs: The length of the transition in seconds.
        image_size: The dimensions of the photographs to be generated.
    """

    img_shape = (image_size[1], image_size[0], 3)
    num_steps = int(fps * time_duration_secs)

    for t in np.linspace(0, 1, num_steps):
        color_rgb_trans = interpolate_color_rgb(color_start_rgb, color_end_rgb, t)
        color_hue_trans = interpolate_color_hsv(color_start_rgb, color_end_rgb, t)

        img_rgb = np.full(form=img_shape, fill_value=color_rgb_trans, dtype=np.uint8)
        img_hsv = np.full(form=img_shape, fill_value=color_hue_trans, dtype=np.uint8)

        composite = cv2.hconcat((img_rgb, img_hsv))
        composite_bgr = cv2.cvtColor(composite, cv2.COLOR_RGB2BGR)

        cv2.imshow("Shade Transition", composite_bgr)

        key = cv2.waitKey(1000 // fps) & 0xFF
        if key == ord("q"):
            break

    cv2.destroyAllWindows()

Now we will merely name this perform with two colours for which we need to visualize the transition. Beneath I visualize the transition from blue to yellow.

run_transition_loop(
    color_start_rgb=(0, 0, 255),  # Blue
    color_end_rgb=(255, 255, 0),  # Yellow
    fps=25,
    time_duration_secs=5,
    image_size=(512, 256),
)

The distinction is kind of drastic. Whereas the saturation and brightness stay fixed in the fitting animation, they modify significantly for the transition that interpolates straight within the RGB area.


For extra implementation particulars, take a look at the total supply code within the GitHub repository:

https://github.com/trflorian/auto-color-filter


All visualizations on this put up have been created by the creator.

Tags: HSVRGB
Previous Post

Execs, Cons & Comparability with Stackby

Next Post

China’s cloud giants eye Center East

Next Post
China’s cloud giants eye Center East

China’s cloud giants eye Center East

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Trending

Detecting Quick Flux with Sysdig Safe and VirusTotal

Detecting Quick Flux with Sysdig Safe and VirusTotal

April 8, 2025
5 Efficient Methods to Safe Your Docker Containers | by Francesco Pastore | Apr, 2025

5 Efficient Methods to Safe Your Docker Containers | by Francesco Pastore | Apr, 2025

April 16, 2025
Meet the Google for Startups Accelerator: AI for Nature cohort

Meet the Google for Startups Accelerator: AI for Nature cohort

May 3, 2025
FinOps could be a large waste of cash

GreenOps for sustainability should parallel FinOps for value

January 25, 2025
Packaging That Sells: The Startup Playbook for Constructing a Model with Affect

Packaging That Sells: The Startup Playbook for Constructing a Model with Affect

January 29, 2025
Your Information to Snowflake Certifications for 2025

Your Information to Snowflake Certifications for 2025

April 3, 2025

MultiCloud365

Welcome to MultiCloud365 — your go-to resource for all things cloud! Our mission is to empower IT professionals, developers, and businesses with the knowledge and tools to navigate the ever-evolving landscape of cloud technology.

Category

  • AI and Machine Learning in the Cloud
  • AWS
  • Azure
  • Case Studies and Industry Insights
  • Cloud Architecture
  • Cloud Networking
  • Cloud Platforms
  • Cloud Security
  • Cloud Trends and Innovations
  • Data Management
  • DevOps and Automation
  • GCP
  • IAC
  • OCI

Recent News

Safe & Environment friendly File Dealing with in Spring Boot: Learn, Write, Compress, and Defend | by Rishi | Mar, 2025

Safe & Environment friendly File Dealing with in Spring Boot: Learn, Write, Compress, and Defend | by Rishi | Mar, 2025

May 15, 2025
Bitwarden vs Dashlane: Evaluating Password Managers

Bitwarden vs Dashlane: Evaluating Password Managers

May 15, 2025
  • About Us
  • Privacy Policy
  • Disclaimer
  • Contact

© 2025- https://multicloud365.com/ - All Rights Reserved

No Result
View All Result
  • Home
  • Cloud Architecture
    • OCI
    • GCP
    • Azure
    • AWS
    • IAC
    • Cloud Networking
    • Cloud Trends and Innovations
    • Cloud Security
    • Cloud Platforms
  • Data Management
  • DevOps and Automation
    • Tutorials and How-Tos
  • Case Studies and Industry Insights
    • AI and Machine Learning in the Cloud

© 2025- https://multicloud365.com/ - All Rights Reserved