C# OpenCV histogram gray color BGR 그리기
2021. 1. 9. 09:00ㆍOpenCV/OpenCV C#
반응형
구글링하니 히스토그램 그리는 방법은 많이 나온다.
하지만 Opencvsharp으로 컬러 히스토그램을 그리는 방법이 없어서 내가 만들었다.
1. 흑백 이미지 히스토그램
CvtColor 메소드를 이용하여 색생 변환한다.
실습 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
namespace Histogram
{
class Program
{
static void Main(string[] args)
{
Mat src = Cv2.ImRead("../../opencv.png");
Mat gray = new Mat();
Mat hist = new Mat();
Mat result = Mat.Ones(new Size(256, src.Height), MatType.CV_8UC1);
Mat dst = new Mat();
Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY);
Cv2.CalcHist(new Mat[] { gray }, new int[] { 0 }, null, hist, 1, new int[] { 256 }, new Rangef[] { new Rangef(0, 256) });
Cv2.Normalize(hist, hist, 0, 255, NormTypes.MinMax);
for (int i = 0; i < hist.Rows; i++)
{
Cv2.Line(result, new Point(i, src.Height), new Point(i, src.Height - hist.Get<float>(i)), Scalar.White);
}
Cv2.ImShow("img", gray);
Cv2.ImShow("histogram", result);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
}
결과
2. 컬러 이미지 히스토그램
CvtColor 메소드를 이용하여 색생 변환한다.
채널을 추가한다.
실습코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
namespace Histogram
{
class Program
{
static void Main(string[] args)
{
Mat src = Cv2.ImRead("../../opencv.png");
Mat color = new Mat();
Mat histB = new Mat();
Mat histG = new Mat();
Mat histR = new Mat();
Mat resultB = Mat.Ones(new Size(256, src.Height), MatType.CV_8UC3);
Mat resultG = Mat.Ones(new Size(256, src.Height), MatType.CV_8UC3);
Mat resultR = Mat.Ones(new Size(256, src.Height), MatType.CV_8UC3);
Cv2.CvtColor(src, color, ColorConversionCodes.BGR2BGRA);
Cv2.CalcHist(new Mat[] { color }, new int[] { 0 }, null, histB, 1, new int[] { 256 }, new Rangef[] { new Rangef(0, 256) });
Cv2.Normalize(histB, histB, 0, 255, NormTypes.MinMax);
Cv2.CalcHist(new Mat[] { color }, new int[] { 1 }, null, histG, 1, new int[] { 256 }, new Rangef[] { new Rangef(0, 256) });
Cv2.Normalize(histG, histG, 0, 255, NormTypes.MinMax);
Cv2.CalcHist(new Mat[] { color }, new int[] { 2 }, null, histR, 1, new int[] { 256 }, new Rangef[] { new Rangef(0, 256) });
Cv2.Normalize(histR, histR, 0, 255, NormTypes.MinMax);
for (int i = 0; i < histB.Rows; i++)
{
Cv2.Line(resultB, new Point(i, src.Height), new Point(i, src.Height - histB.Get<float>(i)), Scalar.Blue);
}
for (int i = 0; i < histG.Rows; i++)
{
Cv2.Line(resultG, new Point(i, src.Height), new Point(i, src.Height - histG.Get<float>(i)), Scalar.Green);
}
for (int i = 0; i < histR.Rows; i++)
{
Cv2.Line(resultR, new Point(i, src.Height), new Point(i, src.Height - histR.Get<float>(i)), Scalar.Red);
}
Cv2.ImShow("img", color);
Cv2.ImShow("Blue", resultB);
Cv2.ImShow("Green", resultG);
Cv2.ImShow("Red", resultR);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
}
결과
3. 흑백 이미지와 컬러 이미지 히스토그램 그리기의 차이점
흑백 이미지는 CvtColor를 이용하여 색상변환 후 처리해야 한다.
흑백 이미지는 채널을 1개 사용한다. (CV_8UC1)
컬러이미지는 CvtColor를 이용하여 알파채널을 추가한 후에 처리해야 한다.
컬러이미지는 채널을 3개 사용한다. (CV_8UC3)
반응형
'OpenCV > OpenCV C#' 카테고리의 다른 글
C# OpenCV Transformation (0) | 2021.01.17 |
---|---|
C# OpenCV labeling Segmentation (0) | 2021.01.12 |
C# OpenCV 이미지 전처리 (0) | 2021.01.06 |
C# OpenCV 설치하기 (OpenCvSharp4 최신버전 설치) (1) | 2021.01.05 |
C# OpenCV 설치하기 (1) | 2021.01.01 |