そこで、結合する画像を捜し、切り取ることはできたのですが、そのまま結合するとHSVが異なるため、欠損領域周辺のHSVに近づけたいと思っております。
HSV値を[キャプチャ.png]のようにHSVを変えました。
しかし、なぜかHSVがうまく変わっていません。
Q1=Q1*b1/a1とするべきなのでしょうか。
どなたかご教授お願いします。
#include<iostream>
#include<opencv/cv.h>
#include<opencv/highgui.h>
#include<opencv2/opencv.hpp>
#include<fstream>
#include<stdio.h>
using namespace std;
using namespace cv;
IplImage *imgS1, *imgS2, *imgS3, *imgS4, *imgW1, *imgW2, *imgW3, *imgW4;
int main(int argc, char **argv)
{ //画像の読み込む(カラー)
imgS1 = cvLoadImage(("S1.bmp"), CV_LOAD_IMAGE_COLOR); imgW1 = cvLoadImage(("W1.bmp"), CV_LOAD_IMAGE_COLOR);
imgS2 = cvLoadImage(("S2.bmp"), CV_LOAD_IMAGE_COLOR); imgW2 = cvLoadImage(("W2.bmp"), CV_LOAD_IMAGE_COLOR);
imgS3 = cvLoadImage(("S3.bmp"), CV_LOAD_IMAGE_COLOR); imgW3 = cvLoadImage(("W3.bmp"), CV_LOAD_IMAGE_COLOR);
imgS4 = cvLoadImage(("S4.bmp"), CV_LOAD_IMAGE_COLOR); imgW4 = cvLoadImage(("W4.bmp"), CV_LOAD_IMAGE_COLOR);
// HSVを格納するオブジェクトの作成
IplImage* hsvS1 = cvCreateImage(cvGetSize(imgS1), IPL_DEPTH_8U, 3), * hsvW1 = cvCreateImage(cvGetSize(imgW1), IPL_DEPTH_8U, 3),
* hsvS2 = cvCreateImage(cvGetSize(imgS2), IPL_DEPTH_8U, 3), * hsvW2 = cvCreateImage(cvGetSize(imgW2), IPL_DEPTH_8U, 3),
* hsvS3 = cvCreateImage(cvGetSize(imgS3), IPL_DEPTH_8U, 3), * hsvW3 = cvCreateImage(cvGetSize(imgW3), IPL_DEPTH_8U, 3),
* hsvS4 = cvCreateImage(cvGetSize(imgS4), IPL_DEPTH_8U, 3), * hsvW4 = cvCreateImage(cvGetSize(imgW4), IPL_DEPTH_8U, 3);
// BGR -> HSV 変換
cvCvtColor(imgS1, hsvS1, CV_BGR2HSV),cvCvtColor(imgW1, hsvW1, CV_BGR2HSV);
cvCvtColor(imgS2, hsvS2, CV_BGR2HSV), cvCvtColor(imgW2, hsvW2, CV_BGR2HSV);
cvCvtColor(imgS3, hsvS3, CV_BGR2HSV), cvCvtColor(imgW3, hsvW3, CV_BGR2HSV);
cvCvtColor(imgS4, hsvS4, CV_BGR2HSV), cvCvtColor(imgW4, hsvW4, CV_BGR2HSV);
FILE *fpAllH;
errno_t error;
//総数
int countS1 = 0, countS2 = 0, countS3 = 0, countS4 = 0, countW1 = 0, countW2 = 0, countW3 = 0, countW4 = 0;
uchar qS1[3], qS2[3], qS3[3], qS4[3], qW1[3], qW2[3], qW3[3], qW4[3];
//平均
float hS1[3], hS2[3], hS3[3], hS4[3], hW1[3], hW2[3], hW3[3], hW4[3];
//初期化
hS1[0] = 0; hS1[1] = 0; hS1[2] = 0; hW1[0] = 0; hW1[1] = 0; hW1[2] = 0;
hS2[0] = 0; hS2[1] = 0; hS2[2] = 0; hW2[0] = 0; hW2[1] = 0; hW2[2] = 0;
hS3[0] = 0; hS3[1] = 0; hS3[2] = 0; hW3[0] = 0; hW3[1] = 0; hW3[2] = 0;
hS4[0] = 0; hS4[1] = 0; hS4[2] = 0; hW4[0] = 0; hW4[1] = 0; hW4[2] = 0;
//ファイルOPEN
if ((error = fopen_s(&fpAllH, "AllH.csv", "w"))){
return 0;
}
//S1///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (int y = 0; y < hsvS1->height; y++) {
for (int x = 0; x < hsvS1->width; x++) {
// HSVの取得
if (0 <= y && 0 <= x && y < hsvS1->height && x < hsvS1->width){
qS1[0] = hsvS1->imageData[hsvS1->widthStep * y + x * 3]; // H
qS1[1] = hsvS1->imageData[hsvS1->widthStep * y + x * 3 + 1]; // S
qS1[2] = hsvS1->imageData[hsvS1->widthStep * y + x * 3 + 2]; // V
//HSVの和を求める
hS1[0] = hS1[0] + (float)qS1[0];
hS1[1] = hS1[1] + (float)qS1[1];
hS1[2] = hS1[2] + (float)qS1[2];
countS1++;
//出力
printf("H:S:V"); printf("(%d,", qS1[0]); printf("%d,", qS1[1]); printf("%d)\n", qS1[2]);
}
}
}
//excelに平均を出力
hS1[0] = hS1[0] / countS1;
hS1[1] = hS1[1] / countS1;
hS1[2] = hS1[2] / countS1;
fprintf(fpAllH, "%d,%d,%d \n", hS1[0],hS1[1], hS1[2]);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//S2///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (int y = 0; y < hsvS2->height; y++) {
for (int x = 0; x < hsvS2->width; x++) {
// HSVの取得
if (0 <= y && 0 <= x && y < hsvS2->height && x < hsvS2->width){
qS2[0] = hsvS2->imageData[hsvS2->widthStep * y + x * 3]; // H
qS2[1] = hsvS2->imageData[hsvS2->widthStep * y + x * 3 + 1]; // S
qS2[2] = hsvS2->imageData[hsvS2->widthStep * y + x * 3 + 2]; // V
//HSVそれぞれ平均を求める
hS2[0] = hS2[0] + (float)qS2[0];
hS2[1] = hS2[1] + (float)qS2[1];
hS2[2] = hS2[2] + (float)qS2[2];
countS2++;
//出力
printf("H:S:V"); printf("(%d,", qS2[0]); printf("%d,", qS2[1]); printf("%d)\n", qS2[2]);
}
}
}
//excelに平均を出力
hS2[0] = hS2[0] / countS2;
hS2[1] = hS2[1] / countS2;
hS2[2] = hS2[2] / countS2;
fprintf(fpAllH, "%d,%d,%d \n",hS2[0],hS2[1],hS2[2]);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//S3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (int y = 0; y < hsvS3->height; y++) {
for (int x = 0; x < hsvS3->width; x++) {
// HSVの取得
if (0 <= y && 0 <= x && y < hsvS3->height && x < hsvS3->width){
qS3[0] = hsvS3->imageData[hsvS3->widthStep * y + x * 3]; // H
qS3[1] = hsvS3->imageData[hsvS3->widthStep * y + x * 3 + 1]; // S
qS3[2] = hsvS3->imageData[hsvS3->widthStep * y + x * 3 + 2]; // V
//HSVそれぞれ平均を求める
hS3[0] = hS3[0] + (float)qS3[0];
hS3[1] = hS3[1] + (float)qS3[1];
hS3[2] = hS3[2] + (float)qS3[2];
countS3++;
//出力
printf("H:S:V"); printf("(%d,", qS3[0]); printf("%d,", qS3[1]); printf("%d)\n", qS3[2]);
}
}
}
//excelに平均を出力
hS3[0] = hS3[0] / countS3;
hS3[1] = hS3[1] / countS3;
hS3[2] = hS3[2] / countS3;
fprintf(fpAllH, "%d,%d,%d \n",hS3[0],hS3[1],hS3[2]);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//S4///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (int y = 0; y < hsvS4->height; y++) {
for (int x = 0; x < hsvS4->width; x++) {
// HSVの取得
if (0 <= y && 0 <= x && y < hsvS4->height && x < hsvS4->width){
qS4[0] = hsvS4->imageData[hsvS4->widthStep * y + x * 3]; // H
qS4[1] = hsvS4->imageData[hsvS4->widthStep * y + x * 3 + 1]; // S
qS4[2] = hsvS4->imageData[hsvS4->widthStep * y + x * 3 + 2]; // V
//HSVそれぞれ平均を求める
hS4[0] = hS4[0] + (float)qS4[0];
hS4[1] = hS4[1] + (float)qS4[1];
hS4[2] = hS4[2] + (float)qS4[2];
countS4++;
//出力
printf("H:S:V"); printf("(%d,", qS4[0]); printf("%d,", qS4[1]); printf("%d)\n", qS4[2]);
}
}
}
//excelに平均を出力
hS4[0] = hS4[0] / countS4;
hS4[1] = hS4[1] / countS4;
hS4[2] = hS4[2] / countS4;
fprintf(fpAllH, "%d,%d,%d \n",hS4[0],hS4[1],hS4[2]);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//W1///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (int y = 0; y < hsvW1->height; y++) {
for (int x = 0; x < hsvW1->width; x++) {
// HSVの取得
if (0 <= y && 0 <= x && y < hsvW1->height && x < hsvW1->width){
qW1[0] = hsvW1->imageData[hsvW1->widthStep * y + x * 3]; // H
qW1[1] = hsvW1->imageData[hsvW1->widthStep * y + x * 3 + 1]; // S
qW1[2] = hsvW1->imageData[hsvW1->widthStep * y + x * 3 + 2]; // V
//HSVそれぞれ平均を求める
hW1[0] = hW1[0] + (float)qW1[0];
hW1[1] = hW1[1] + (float)qW1[1];
hW1[2] = hW1[2] + (float)qW1[2];
countW1++;
//出力
printf("H:S:V"); printf("(%d,", qW1[0]); printf("%d,", qW1[1]); printf("%d)\n", qW1[2]);
}
}
}
//excelに平均を出力
hW1[0] = hW1[0] / countW1;
hW1[1] = hW1[1] / countW1;
hW1[2] = hW1[2] / countW1;
fprintf(fpAllH, "%d,%d,%d \n",hW1[0], hW1[1],hW1[2]);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//W2///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (int y = 0; y < hsvW2->height; y++) {
for (int x = 0; x < hsvW2->width; x++) {
// HSVの取得
if (0 <= y && 0 <= x && y < hsvW2->height && x < hsvW2->width){
qW2[0] = hsvW2->imageData[hsvW2->widthStep * y + x * 3]; // H
qW2[1] = hsvW2->imageData[hsvW2->widthStep * y + x * 3 + 1]; // S
qW2[2] = hsvW2->imageData[hsvW2->widthStep * y + x * 3 + 2]; // V
//HSVそれぞれ平均を求める
hW2[0] = hW2[0] + (float)qW2[0];
hW2[1] = hW2[1] + (float)qW2[1];
hW2[2] = hW2[2] + (float)qW2[2];
countW2++;
//出力
printf("H:S:V"); printf("(%d,", qW2[0]); printf("%d,", qW2[1]); printf("%d)\n", qW2[2]);
}
}
}
//excelに平均を出力
hW2[0] = hW2[0] / countW2;
hW2[1] = hW2[1] / countW2;
hW2[2] = hW2[2] / countW2;
fprintf(fpAllH, "%d,%d,%d \n",hW2[0],hW2[1],hW2[2]);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//W3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (int y = 0; y < hsvW3->height; y++) {
for (int x = 0; x < hsvW3->width; x++) {
// HSVの取得
if (0 <= y && 0 <= x && y < hsvW3->height && x < hsvW3->width){
qW3[0] = hsvW3->imageData[hsvW3->widthStep * y + x * 3]; // H
qW3[1] = hsvW3->imageData[hsvW3->widthStep * y + x * 3 + 1]; // S
qW3[2] = hsvW3->imageData[hsvW3->widthStep * y + x * 3 + 2]; // V
//HSVそれぞれ平均を求める
hW3[0] = hW3[0] + (float)qW3[0];
hW3[1] = hW3[1] + (float)qW3[1];
hW3[2] = hW3[2] + (float)qW3[2];
countW3++;
//出力
printf("H:S:V"); printf("(%d,", qW3[0]); printf("%d,", qW3[1]); printf("%d)\n", qW3[2]);
}
}
}
//excelに平均を出力
hW3[0] = hW3[0] / countW3;
hW3[1] = hW3[1] / countW3;
hW3[2] = hW3[2] / countW3;
fprintf(fpAllH, "%d,%d,%d \n",hW3[0],hW3[1],hW3[2]);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//W4///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for (int y = 0; y < hsvW4->height; y++) {
for (int x = 0; x < hsvW4->width; x++) {
// HSVの取得
if (0 <= y && 0 <= x && y < hsvW4->height && x < hsvW4->width){
qW4[0] = hsvW4->imageData[hsvW4->widthStep * y + x * 3]; // H
qW4[1] = hsvW4->imageData[hsvW4->widthStep * y + x * 3 + 1]; // S
qW4[2] = hsvW4->imageData[hsvW4->widthStep * y + x * 3 + 2]; // V
//HSVそれぞれ平均を求める
hW4[0] = hW4[0] + (float)qW4[0];
hW4[1] = hW4[1] + (float)qW4[1];
hW4[2] = hW4[2] + (float)qW4[2];
countW4++;
//出力
printf("H:S:V"); printf("(%d,", qW4[0]); printf("%d,", qW4[1]); printf("%d)\n", qW4[2]);
}
}
}
//excelに平均を出力
hW4[0] = hW4[0] / countW4;
hW4[1] = hW4[1] / countW4;
hW4[2] = hW4[2] / countW4;
fprintf(fpAllH, "%d,%d,%d \n",hW4[0],hW4[1],hW4[2]);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//平均の出力
printf("hS1[H]の平均:%f ", hS1[0]); printf("hS1[S]の平均:%f ", hS1[1]); printf("hS1[V]の平均:%f\n", hS1[2]);
printf("hS2[H]の平均:%f ", hS2[0]); printf("hS2[S]の平均:%f ", hS2[1]); printf("hS2[V]の平均:%f\n", hS2[2]);
printf("hS3[H]の平均:%f ", hS3[0]); printf("hS3[S]の平均:%f ", hS3[1]); printf("hS3[V]の平均:%f\n", hS3[2]);
printf("hS4[H]の平均:%f ", hS4[0]); printf("hS4[S]の平均:%f ", hS4[1]); printf("hS4[V]の平均:%f\n", hS4[2]);
printf("hW1[H]の平均:%f ", hW1[0]); printf("hW1[S]の平均:%f ", hW1[1]); printf("hW1[V]の平均:%f\n", hW1[2]);
printf("hW2[H]の平均:%f ", hW2[0]); printf("hW2[S]の平均:%f ", hW2[1]); printf("hW2[V]の平均:%f\n", hW2[2]);
printf("hW3[H]の平均:%f ", hW3[0]); printf("hW3[S]の平均:%f ", hW3[1]); printf("hW3[V]の平均:%f\n", hW3[2]);
printf("hW4[H]の平均:%f ", hW4[0]); printf("hW4[S]の平均:%f ", hW4[1]); printf("hW4[V]の平均:%f\n", hW4[2]);
//QにかけるHSV値
double xHQ1 = 0, xSQ1 = 0, xVQ1 = 0,
xHQ2 = 0, xSQ2 = 0, xVQ2 = 0,
xHQ3 = 0, xSQ3 = 0, xVQ3 = 0,
xHQ4 = 0, xSQ4 = 0, xVQ4 = 0;
//Q1 の H S V
xHQ1 = hS1[0] / hW1[0]; xSQ1 = hS1[1] / hW1[1]; xVQ1 = hS1[2] / hW1[2];
//Q2 の H S V
xHQ2 = hS2[0] / hW2[0]; xSQ2 = hS2[1] / hW2[1]; xVQ2 = hS2[2] / hW2[2];
//Q3 の H S V
xHQ3 = hS3[0] / hW3[0]; xSQ3 = hS3[1] / hW3[1]; xVQ3 = hS3[2] / hW3[2];
//Q4 の H S V
xHQ4 = hS4[0] / hW4[0]; xSQ4 = hS4[1] / hW4[1]; xVQ4 = hS4[2] / hW4[2];
printf("Q1にかけるH値%flS値%fV値%f", xHQ1, xSQ1, xVQ1);
printf("Q2にかけるH値%flS値%fV値%f", xHQ2, xSQ2, xVQ2);
printf("Q3にかけるH値%flS値%fV値%f", xHQ3, xSQ3, xVQ3);
printf("Q4にかけるH値%flS値%fV値%f", xHQ4, xSQ4, xVQ4);
//総数の出力
printf("S1の総数:%d\n", countS1);
printf("S2の総数:%d\n", countS2);
printf("S3の総数:%d\n", countS3);
printf("S4の総数:%d\n", countS4);
printf("W1の総数:%d\n", countW1);
printf("W2の総数:%d\n", countW2);
printf("W3の総数:%d\n", countW3);
printf("W4の総数:%d\n", countW4);
/////・・・Change Of HSV/////////////////////////////////////////////////////
//変えるH(色相) S(彩度)
double HQ1 = xHQ1, HQ2 = xHQ2, HQ3 = xHQ3, HQ4 = xHQ4;
double SQ1 = xSQ1, SQ2 = xSQ2, SQ3 = xSQ3, SQ4 = xSQ4;
double VQ1 = xVQ1, VQ2 = xVQ2, VQ3 = xVQ3, VQ4 = xVQ4;
//
Mat hsv_Q1, HSVQ1, BGRQ1, hsv_Q4, HSVQ4, BGRQ4,
hsv_Q2, HSVQ2, BGRQ2, hsv_Q3, HSVQ3, BGRQ3;
Mat pQ1[3], qQ1[3], pQ2[3], qQ2[3], pQ3[3], qQ3[3], pQ4[3], qQ4[3];
Mat Q1tmpQ1[3], Q2tmpQ2[3], Q3tmpQ3[3], Q4tmpQ4[3];
//画像の読み込み
Mat imgQ1 = imread("Q1.bmp"), imgQ2 = imread("Q2.bmp"),
imgQ3 = imread("Q3.bmp"), imgQ4 = imread("Q4.bmp");
//HSVに変換
cvtColor(imgQ1, hsv_Q1, CV_BGR2HSV), cvtColor(imgQ2, hsv_Q2, CV_BGR2HSV),
cvtColor(imgQ3, hsv_Q3, CV_BGR2HSV), cvtColor(imgQ4, hsv_Q4, CV_BGR2HSV);
//Q1////////////////////////////////////////////////////////////////////////////
//(H,S,V)に分離
split(hsv_Q1, pQ1);
//Matの型変換(少数の積を正確にするため)
pQ1[0].convertTo(Q1tmpQ1[0], CV_32F);
pQ1[1].convertTo(Q1tmpQ1[1], CV_32F);
pQ1[2].convertTo(Q1tmpQ1[2], CV_32F);
//HSVの値を変更
qQ1[0] = pQ1[0] * SQ1;
qQ1[1] = pQ1[1] * HQ1;
qQ1[2] = pQ1[2] * VQ1;
merge(qQ1, 3, HSVQ1);
//BGRに変換
cvtColor(HSVQ1, BGRQ1, CV_HSV2BGR);
namedWindow("Q1");
imshow("Q1", BGRQ1);
////////////////////////////////////////////////////////////////////////////////
//Q2////////////////////////////////////////////////////////////////////////////
//(H,S,V)に分離
split(hsv_Q2, pQ2);
//Matの型変換(少数の積を正確にするため)
pQ2[0].convertTo(Q2tmpQ2[0], CV_32F);
pQ2[1].convertTo(Q2tmpQ2[1], CV_32F);
pQ2[2].convertTo(Q2tmpQ2[2], CV_32F);
//HSVの値を変更
qQ2[0] = pQ2[0] * SQ2;
qQ2[1] = pQ2[1] * HQ2;
qQ2[2] = pQ2[2] * VQ2;
merge(qQ2, 3, HSVQ2);
//BGRに変換
cvtColor(HSVQ2, BGRQ2, CV_HSV2BGR);
namedWindow("Q2");
imshow("Q2", BGRQ2);
////////////////////////////////////////////////////////////////////////////////
//Q3////////////////////////////////////////////////////////////////////////////
//(H,S,V)に分離
split(hsv_Q3, pQ3);
//Matの型変換(少数の積を正確にするため)
pQ3[0].convertTo(Q3tmpQ3[0], CV_32F);
pQ3[1].convertTo(Q3tmpQ3[1], CV_32F);
pQ3[2].convertTo(Q3tmpQ3[2], CV_32F);
//HSVの値を変更
qQ3[0] = pQ3[0] * SQ3;
qQ3[1] = pQ3[1] * HQ3;
qQ3[2] = pQ3[2] * VQ3;
merge(qQ3, 3, HSVQ3);
//BGRに変換
cvtColor(HSVQ3, BGRQ3, CV_HSV2BGR);
namedWindow("Q3");
imshow("Q3", BGRQ3);
////////////////////////////////////////////////////////////////////////////////
//Q4////////////////////////////////////////////////////////////////////////////
//(H,S,V)に分離
split(hsv_Q4, pQ4);
//Matの型変換(少数の積を正確にするため)
pQ4[0].convertTo(Q4tmpQ4[0], CV_32F);
pQ4[1].convertTo(Q4tmpQ4[1], CV_32F);
pQ4[2].convertTo(Q4tmpQ4[2], CV_32F);
//HSVの値を変更
qQ4[0] = pQ4[0] * SQ4;
qQ4[1] = pQ4[1] * HQ4;
qQ4[2] = pQ4[2] * VQ4;
merge(qQ4, 3, HSVQ4);
//BGRに変換
cvtColor(HSVQ4, BGRQ4, CV_HSV2BGR);
namedWindow("Q4");
imshow("Q4", BGRQ4);
////////////////////////////////////////////////////////////////////////////////
//ファイルを閉じる
fclose(fpAllH);
cvNamedWindow("Image", CV_WINDOW_AUTOSIZE);
cvShowImage("Image", hsvS1);
cvWaitKey(0);
cvDestroyWindow("Image");
cvReleaseImage(&hsvS1), cvReleaseImage(&hsvS2), cvReleaseImage(&hsvS3), cvReleaseImage(&hsvS4),
cvReleaseImage(&hsvW1), cvReleaseImage(&hsvW2), cvReleaseImage(&hsvW3), cvReleaseImage(&hsvW4);
// 画像を保存する
cv::imwrite("HSVQ1.bmp", BGRQ1);
cv::imwrite("HSVQ2.bmp", BGRQ2);
cv::imwrite("HSVQ3.bmp", BGRQ3);
cv::imwrite("HSVQ4.bmp", BGRQ4);
destroyAllWindows();
/////
return 0;
}