Wie fülle ich ein OpenCV-Bild mit einer Farbe?


Antworten:


98

Verwenden der OpenCV C-API mit IplImage* img:

Verwenden Sie cvSet () :cvSet(img, CV_RGB(redVal,greenVal,blueVal));

Verwenden Sie die OpenCV C ++ - API mit cv::Mat imgund verwenden Sie dann entweder:

cv::Mat::operator=(const Scalar& s) wie in:

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

oder allgemeiner, Maskenunterstützung ,cv::Mat::setTo() :

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

4
Sollte es rot, grün, blau oder blau, grün, rot sein? Ist es nicht blau, grün, rot in opencv?
PC

15
Es ist blau, grün, rot. Bestätigt
TheUnexpected

4
Tatsächlich ist OpenCV kanalordnungsunabhängig. Sie haben Recht, dass die häufigste Kanalreihenfolge (auf PCs) ist, BGRobwohl dies für diese Antwort nicht sehr relevant ist. Es liegt im Allgemeinen in der Verantwortung des Benutzers, die Kanalreihenfolge zu verfolgen.
Adi Shavit

@AdiShavit können wir die eingestellte Farbe aus dem Bild entfernen?
Shwetabh Shekhar

2
@ShwetabhShekhar: Diese Frage hat so viele verschiedene Bedeutungen und Antworten, dass sie weit über den Rahmen eines Kommentars hinausgeht ... Versuchen Sie, sie als vollständige Frage zu stellen und mehr Kontext für das bereitzustellen, was Sie tun möchten. Vereinfacht ausgedrückt: Was meinen Sie mit dem "Entfernen" eines Tripletts von Werten aus einem vorhandenen C-Array?
Adi Shavit

35

So geht's mit cv2 in 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)

Hier ist ein vollständigeres Beispiel zum Erstellen eines neuen leeren Bilds, das mit einer bestimmten RGB-Farbe gefüllt ist

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)

10

Am einfachsten ist die Verwendung der OpenCV Mat-Klasse:

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

wo imgwurde definiert als cv::Mat.


7

Erstellen Sie ein neues 640x480-Bild und füllen Sie es mit lila (rot + blau):

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

Hinweis:

  • Höhe vor Breite
  • Typ CV_8UC3 bedeutet 8-Bit-Int ohne Vorzeichen, 3 Kanäle
  • Farbformat ist BGR

6

Für ein 8-Bit-OpenCV-Image (CV_8U) lautet die Syntax:

Mat img(Mat(nHeight, nWidth, CV_8U);
img = cv::Scalar(50);    // or the desired uint8_t value from 0-255

5

Verwenden Sie numpy.full. Hier ist ein Python, der ein graues, blaues, grünes und rotes Bild erstellt und in einem 2x2-Raster angezeigt wird.

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')

Wie würden Sie dies mit einer nicht grauen Farbe tun?
Alecg_O

Aktualisiert mit nicht grauem Beispiel.
Orangepips

4

Wenn Sie Java für OpenCV verwenden, können Sie den folgenden Code verwenden.

Mat img = src.clone(); //Clone from the original image
img.setTo(new Scalar(255,255,255)); //This sets the whole image to white, it is R,G,B value

0

Ich persönlich habe diesen Python-Code erstellt, um die Farbe eines gesamten mit openCV geöffneten oder erstellten Bildes zu ändern. Es tut mir leid, wenn es nicht gut genug ist, ich bin Anfänger 😚😚.

def OpenCvImgColorChanger(img,blue = 0,green = 0,red = 0):
line = 1
ImgColumn = int(img.shape[0])-2
ImgRaw  = int(img.shape[1])-2



for j in range(ImgColumn):

    for i in range(ImgRaw):

        if i == ImgRaw-1:
            line +=1

        img[line][i][2] = int(red)
        img[line][i][1] = int(green)
        img[line][i][0] = int(blue)

1
Willkommen bei SO! Wenn Sie eine alte Frage beantworten möchten (diese ist fast 10 Jahre alt), die bereits eine akzeptierte Antwort hat (das ist hier der Fall), fragen Sie sich bitte: Habe ich wirklich eine wesentliche Verbesserung zu bieten? Wenn nicht, sollten Sie nicht antworten.
Timus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.