Opencv3 C ++ VS2017 연구 노트 01 마스크

  • 그림 픽셀의 3 개 채널 매트릭스는 다음과 같이 배열됩니다.
    • [[r11, g11, b11, r12, g12, b12, r13, g13, b13, .........], [r_ij, g_ij, b_ig,], [......... ...]]
    • 즉, 첫 번째 줄에는 [r11, g11, b11, r12, g12, b12, r13, g13, b13]이 있습니다.
    • ij 번째 픽셀의 RGB 값은 다음 대신 함께 연속적입니다. [r11, r12, r13, g11, g12, g13, b11, b12, b13]
  • 마스크
    • 그것은 실리콘 웨이퍼 조각에서 비롯됩니다. 실리콘 웨이퍼의 영역을 선택하고 보드로 덮은 다음 보드로 덮인 곳을 제외한 모든 것을 조각하는 것을 의미합니다.
  • 이미지 마스크

    • image \ graphics \ object \ matrix를 사용하여 처리 할 이미지를 처리하여 처리 영역에 영향을줍니다.

  • 마스크 사용 :
    • 관심 영역 : 위에서 언급 한 이미지 \ 그래픽 \ 객체 \ 매트릭스이며, 미리 만들어진 관심 영역 마스크와 관심 이미지, 관심 영역을 얻기 위해 처리 할 이미지를 곱합니다.
    • 먼저 이미지 픽셀의 값을 가져옵니다. 이미지 픽셀 포인터로
      • Mat.ptr <uchar> (int i = 0)은 픽셀 행렬의 포인터를 가져오고 인덱스 i는 0부터 시작하는 행 수를 나타냅니다.
      • const uchar * current = myImage.ptr <uchar> (행); 
      • 행은 변경되지 않고 열은 픽셀 값을 얻기 위해 변경됩니다. p (row, col) = current [col];
    • 그런 다음 입력 이미지가 uchar 유형인지 확인하고 CV_Assert 함수를 사용하여 구별하고 매개 변수가 FALSE로 ERROR를 반환하는지 확인합니다.
      • CV_Assert (MyImage.depth () == CV_8U);
    • 마지막으로 일부 픽셀 값이 처리됩니다.
      • I (i, j) = 5 * I (i, j)-[I (i-1, j) + I (i + 1, j) + I (i, j-1) + I (i, j + 1)]
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <cmath>

using namespace std;
using namespace cv;

int main(int argc, char ** argv)
{
	Mat myImage = imread("图片地址");
	CV_Assert(myImage.depth() == CV_8U);
	namedWindow("mask_demo", WINDOW_AUTOSIZE);
	imshow("mask_demo", myImage);

	Mat resultImage;
	myImage.copyTo(resultImage);     
	int nchannels = myImage.channels();
	int height = myImage.rows;
	int cols = myImage.cols;
	int width = myImage.cols*nchannels;
	for (int row = 1; row < height - 1; row++)
	{
		const uchar * previous = myImage.ptr<uchar>(row - 1);
		const uchar*current = myImage.ptr<uchar>(row);
		const uchar* next = myImage.ptr<uchar>(row + 1);
		uchar * output = resultImage.ptr<uchar>(row);
		for (int col = nchannels; col < nchannels*(myImage.cols - 1); col++)
		{
			*output = saturate_cast<uchar>(5 * current[col] - previous[col] - next[col] - current[col - nchannels] - current[col + nchannels]);
			output++;
		}
	}
	namedWindow("mask_result", WINDOW_AUTOSIZE);
	imshow("mask_result", resultImage);

	waitKey(0);
	return 0;
}
  • 그림과 같이 행이 바뀌지 않고 열이 바뀌어 행을 결정하기는 쉽지만 col이 더 어렵다.
    • 어려운 점은 이전에 픽셀 매트릭스의 특정 배열을 파악하지 못했고 쿼리 후 다음 표를 만들었습니다 (11에서 시작한다고 가정).
    • 연속적인 회색과 흰색은 픽셀 아래 세 채널의 값입니다.
    • current [col-nchannels]는 g22의 첨자입니다. -3은 g21의 첨자입니다.
    • rgb의 값은 덧셈과 뺄셈에 해당하며, r 채널의 값을 사용하여 g 채널의 값으로 계산할 수 없습니다.

 

  • API, 즉 마스크 계산을 수행하는 기능을 사용하면 위보다 훨씬 간단합니다.
    • 마스크 정의
      • 매트 커널 = (Mat_ <char> (3,3) << 0, -1,0, -1,5, -1, 0, -1,0);
      • filter2D (src, dst, src.depth (), 커널);
        • src 및 dst는 Mat 객체입니다.
        • src.depth는 비트 맵 깊이, 32, 24, 8 등입니다.
        • 필터는 분류 자입니다.
int main(int argc, char ** argv)
{
    Mat src,dst;
    src = imread("地址");
    if(!src.data)
    {
        cout<<"no imgae";
        return -1;
    }
    namedWindow("src_image", WINDOW_AUTOSIZE);
    imshow("src_image", src);
    
    Mat Kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
    filter2D(src, dst,src.depth(),Kernel);
    
    namedWindow("kernel_image", WINDOW_AUTOSIZE);
    imshow("kernel_image", dst);
    
    waitKey(0);
    return 0;
}

 

추천

출처blog.csdn.net/Mrsherlock_/article/details/104482476