나는 opencv의 초보자입니다. opencv v2.1을 사용하고 있습니다. RGB 이미지를 HSV 이미지로 변환했습니다. 이제는 단일 채널 색조, 채도 및 채도를 개별적으로 얻고 싶습니다. 어떻게해야합니까? 나는 비슷한 질문을 보았지만 아무도 그렇게 대답하지 않았다. 친절하게 도와주세요.opencv 2.1의 HSV 이미지에서 단일 채널 값 이미지를 얻는 방법은 무엇입니까?
답변
당신은 당신을 OpenCV 2.1을 사용하는 경우, 당신은 IplImage를 사용하고 있어야합니다
1 채널은 H, V.에 대한 S를위한 2 채널, 3 채널이 될 것입니다 당신이 RGB 이미지를 액세스하는 것과 동일한 방법으로 액세스 할 수 있습니다 그럼, 맞지? 은 HSV 이미지가 IplImage *src
인 경우와 같습니다.
IplImage* h = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
IplImage* s = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
IplImage* v = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
// Split image onto the color planes
cvSplit(src, h, s, v, NULL);
cvSplit 함수는 여러 단일 채널로 멀티 어레이를 분할한다. 내가 틀렸다면 나를 바로 잡아라. OpenCV 2.4를 사용하는 것이 좋습니다. 그것은 CvMat과 같은 구조체를 가지고있어서 2D 배열처럼 다루기가 매우 쉽습니다.
편집 : 매트를 사용하는 경우 채널을 쉽게 분리 할 수 있습니다. 당신의 HSS 매트가 Mat img_hsv
이라고 가정 해 봅시다. 다음 :
vector<Mat> hsv_planes;
split(img_hsv, hsv_planes);
hsv_planes[0] // H channel
hsv_planes[1] // S channel
hsv_planes[2] // V channel
이 문제를 해결할 수 있는지 확인하십시오.
여기가 매트입니다 : 파이썬
cv::Mat hsv_image = ...;
std::vector<cv::Mat> hsv_channels;
cv::split(hsv_image, hsv_channels);
cv::Mat h_image = hsv_channels[0];
cv::Mat s_image = hsv_channels[1];
cv::Mat v_image = hsv_channels[2];
도움 주셔서 감사합니다. – userXktape
안녕하세요, 각 채널의 데이터 유형은 Mat입니다. Mat [8 * 8 * CV_8UC3, isCont = true, isSubmat = false, nativeObj = 0x514dee50]과 같은 내용을 인쇄합니다. 간단한 값의 형태로 어떻게 찾을 수 있습니까? 그래서 화면에 출력 할 수있을뿐 아니라 어떻게 값을 미리보기 위해 값을 사용하여 검증 할 수 있습니까? 도와 주셔서 감사합니다. – Solace
@Solace, 귀하가 달성하고자하는 것에 대한 자세한 내용과 함께 귀하의 의견을 새로운 질문으로 제출하십시오. 또한 (Java?) 코드를 포함해야합니다. – Bull
해결 방법 :
import cv2
from matplotlib import pyplot as plt
# Read image in BGR
img_path = "test.jpg"
img = cv2.imread(img_path)
# Convert BGR to HSV and parse HSV
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h, s, v = hsv_img[:, :, 0], hsv_img[:, :, 1], hsv_img[:, :, 2]
# Plot result images
plt.imshow("Original", cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.imshow("HSV", hsv_img)
plt.imshow("H", h)
plt.imshow("S", s)
plt.imshow("V", v)
plt.show()
당신이 그래서 후에 가야 할 한 것을, 어떻게 당신은 H, S 재결합에, V Mats를 다시 합성 이미지로 만드시겠습니까? –
안녕하세요, 두 번째 방법의 경우 각 채널의 데이터 유형은 'Mat'입니다. 이것은'Mat [8 * 8 * CV_8UC3, isCont = true, isSubmat = false, nativeObj = 0x514dee50]'과 같은 것을 인쇄합니다. 간단한 값의 형태로 어떻게 찾을 수 있습니까? 그래서 화면에 출력 할 수있을뿐 아니라 어떻게 값을 미리보기 위해 값을 사용하여 검증 할 수 있습니까? – Solace