81 votes

Comment remplir une image OpenCV avec une couleur unie ?

Comment remplir une image OpenCV avec une couleur unie ?

0 votes

105voto

Adi Shavit Points 4470

Utilisation de l'API C d'OpenCV avec IplImage* img :

Utilisez cvSet() : cvSet(img, CV_RGB(redVal,greenVal,blueVal));

Utilisation de l'API OpenCV C++ avec cv::Mat img alors utilisez l'un ou l'autre :

cv::Mat::operator=(const Scalar& s) comme dans :

img = cv::Scalar(redVal,greenVal,blueVal);

ou le plus général, masque à l'appui, cv::Mat::setTo() :

img.setTo(cv::Scalar(redVal,greenVal,blueVal));

4 votes

Est-ce que ça devrait être rouge, vert, bleu OU bleu, vert, rouge ? Ce n'est pas bleu, vert, rouge dans opencv ?

18 votes

C'est bleu, vert, rouge. Confrmé

4 votes

En fait, OpenCV est agnostique quant à l'ordre des canaux. Vous avez raison de dire que l'ordre des canaux le plus courant (sur les PC) est le suivant BGR bien que cela ne soit pas très pertinent pour cette réponse. C'est généralement la responsabilité de l'utilisateur de suivre l'ordre des canaux.

40voto

Kimmo Points 111

Voici comment faire avec cv2 en Python :

# Create a blank 300x300 black image
image = np.zeros((300, 300, 3), np.uint8)
# Fill image with red color(set each pixel to red)
image[:] = (0, 0, 255)

Voici un exemple plus complet de la façon de créer une nouvelle image vierge remplie d'une certaine couleur RGB.

import cv2
import numpy as np

def create_blank(width, height, rgb_color=(0, 0, 0)):
    """Create new image(numpy array) filled with certain color in RGB"""
    # Create black blank image
    image = np.zeros((height, width, 3), np.uint8)

    # Since OpenCV uses BGR, convert the color first
    color = tuple(reversed(rgb_color))
    # Fill image with color
    image[:] = color

    return image

# Create new blank 300x300 red image
width, height = 300, 300

red = (255, 0, 0)
image = create_blank(width, height, rgb_color=red)
cv2.imwrite('red.jpg', image)

10voto

Stéphane Points 3900

Créez une nouvelle image 640x480 et remplissez-la de violet (rouge+bleu) :

cv::Mat mat(480, 640, CV_8UC3, cv::Scalar(255,0,255));

Note :

  • hauteur avant largeur
  • type CV_8UC3 signifie 8-bit unsigned int, 3 canaux
  • le format de couleur est BGR

10voto

Barnabas Szabolcs Points 4109

Le plus simple est d'utiliser la classe OpenCV Mat :

img=cv::Scalar(blue_value, green_value, red_value);

img a été défini comme un cv::Mat .

7voto

orangepips Points 7494

Utilisez numpy.full . Voici un Python qui crée une image grise, bleue, verte et rouge et l'affiche dans une grille 2x2.

import cv2
import numpy as np

gray_img = np.full((100, 100, 3), 127, np.uint8)

blue_img = np.full((100, 100, 3), 0, np.uint8)
green_img = np.full((100, 100, 3), 0, np.uint8)
red_img = np.full((100, 100, 3), 0, np.uint8)

full_layer = np.full((100, 100), 255, np.uint8)

# OpenCV goes in blue, green, red order
blue_img[:, :, 0] = full_layer
green_img[:, :, 1] = full_layer
red_img[:, :, 2] = full_layer

cv2.imshow('2x2_grid', np.vstack([
    np.hstack([gray_img, blue_img]), 
    np.hstack([green_img, red_img])
]))
cv2.waitKey(0)
cv2.destroyWindow('2x2_grid')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X