C# OpenCV histogram gray color BGR 그리기

2021. 1. 9. 09:00OpenCV/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();
        }
    }
}

 

결과

 

1

 

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();
        }
    }
}

 

결과

 

2

 

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