선명하게 필터-효과 없음

user366312

다음 루틴은 8 비트 인덱스 그레이 스케일 만 선명하게하는 것입니다.

이 코드는 입력 이미지에 영향을 미치지 않는 것 같습니다. 즉, 들어가는 것과 같은 것이 나옵니다.

값을 올리면 strength이미지가 어두워지는 것 같지만 필터링되지 않습니다.

무엇이 잘못 될 수 있습니까?

다음 커널을 사용하고 있습니다.

double[,] _numericalKernel = new double[,] 
                             { { -1, -1, -1, }, 
                               { -1,  9, -1, }, 
                               { -1, -1, -1, }, };

다음은 선명하게하기위한 소스 코드입니다.

    public static Bitmap NonfftSharpen(Bitmap image, double[,] mask, double strength)
    {
        Bitmap bitmap = (Bitmap)image.Clone();

        if (bitmap != null)
        {
            int width = bitmap.Width;
            int height = bitmap.Height;

            if (mask.GetLength(0) != mask.GetLength(1))
            {
                throw new Exception("_numericalKernel dimensions must be same");
            }
            // Create sharpening filter.
            int filterSize = mask.GetLength(0);

            double[,] filter = (double[,])mask.Clone();

            int channels = sizeof(byte);
            double bias = 1.0 - strength;
            double factor = strength / 16.0;
            int halfOfFilerSize = filterSize / 2;

            byte[,] result = new byte[bitmap.Width, bitmap.Height];

            // Lock image bits for read/write.

            BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height),
                                                        ImageLockMode.ReadWrite,
                                                        PixelFormat.Format8bppIndexed);

            // Declare an array to hold the bytes of the bitmap.
            int memorySize = bitmapData.Stride * height;
            byte[] memory = new byte[memorySize];

            // Copy the RGB values into the local array.
            Marshal.Copy(bitmapData.Scan0, memory, 0, memorySize);

            int rgb;
            // Fill the color array with the new sharpened color values.

            for (int y = halfOfFilerSize; y < height - halfOfFilerSize; y++)
            {
                for (int x = halfOfFilerSize; x < width - halfOfFilerSize; x++)
                {
                    for (int filterY = 0; filterY < filterSize; filterY++)
                    {
                        double grayShade = 0.0;

                        for (int filterX = 0; filterX < filterSize; filterX++)
                        {
                            int imageX = (x - halfOfFilerSize + filterX + width) % width;
                            int imageY = (y - halfOfFilerSize + filterY + height) % height;

                            rgb = imageY * bitmapData.Stride + channels * imageX;

                            grayShade += memory[rgb + 0] * filter[filterX, filterY];
                        }

                        rgb = y * bitmapData.Stride + channels * x;

                        int b = Math.Min(Math.Max((int)(factor * grayShade + (bias * memory[rgb + 0])), 0), 255);

                        result[x, y] = (byte)b;
                    }
                }
            }

            // Update the image with the sharpened pixels.
            for (int x = halfOfFilerSize; x < width - halfOfFilerSize; x++)
            {
                for (int y = halfOfFilerSize; y < height - halfOfFilerSize; y++)
                {
                    rgb = y * bitmapData.Stride + channels * x;

                    memory[rgb + 0] = result[x, y];
                }
            }

            // Copy the RGB values back to the bitmap.
            Marshal.Copy(memory, 0, bitmapData.Scan0, memorySize);

            // Release image bits.
            bitmap.UnlockBits(bitmapData);

            return bitmap;

        }
        else
        {
            throw new Exception("input image can't be null");
        }
    }
나이

작동하도록 기능을 약간 변경했습니다. 강도 매개 변수가 내 기능에 영향을 미치지 않도록주의하십시오. 편향 및 요인 값을 사용하여 밝기 등에서 다른 결과를 얻을 수 있습니다.

    public static Bitmap NonfftSharpen(Bitmap image, double[,] mask, double strength)
    {
        Bitmap bitmap = (Bitmap)image.Clone();

        if (bitmap != null)
        {
            int width = bitmap.Width;
            int height = bitmap.Height;

            if (mask.GetLength(0) != mask.GetLength(1))
            {
                throw new Exception("_numericalKernel dimensions must be same");
            }
            // Create sharpening filter.
            int filterSize = mask.GetLength(0);

            double[,] filter = (double[,])mask.Clone();

            int channels = sizeof(byte);
            double bias = 0.0; // 1.0 - strength;
            double factor = 1.0; // strength / 16.0;

            byte[,] result = new byte[bitmap.Width, bitmap.Height];

            // Lock image bits for read/write.

            BitmapData bitmapData = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, width, height),
                                                        ImageLockMode.ReadWrite,
                                                        System.Drawing.Imaging.PixelFormat.Format8bppIndexed);

            // Declare an array to hold the bytes of the bitmap.
            int memorySize = bitmapData.Stride * height;
            byte[] memory = new byte[memorySize];

            // Copy the RGB values into the local array.
            Marshal.Copy(bitmapData.Scan0, memory, 0, memorySize);

            int pixel;
            // Fill the color array with the new sharpened color values.

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    double grayShade = 0.0;

                    for (int filterY = 0; filterY < filterSize; filterY++)
                    {


                        for (int filterX = 0; filterX < filterSize; filterX++)
                        {

                            int imageX = (x - filterSize / 2 + filterX + width) % width;
                            int imageY = (y - filterSize / 2 + filterY + height) % height;

                            pixel = imageY * bitmapData.Stride + channels * imageX;
                            grayShade += memory[pixel] * filter[filterX, filterY];

                        }

                        int newPixel = Math.Min(Math.Max((int)(factor * grayShade + bias), 0), 255);

                        result[x, y] = (byte)newPixel;
                    }
                }
            }

            // Update the image with the sharpened pixels.
            for (int x = 0; x < width; x++)
            {
                for (int y = 0; y < height; y++)
                {
                    pixel = y * bitmapData.Stride + channels * x;

                    memory[pixel] = result[x, y];
                }
            }

            // Copy the values back to the bitmap.
            Marshal.Copy(memory, 0, bitmapData.Scan0, memorySize);

            // Release image bits.
            bitmap.UnlockBits(bitmapData);

            return bitmap;

        }
        else
        {
            throw new Exception("input image can't be null");
        }
    }

나는 이것이 당신이 갈 수 있기를 바랍니다 :) 안부

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

각도 날짜 필터 효과 없음

분류에서Dev

GNOME Classic의 GNOME 터미널 투명성 (효과 없음)

분류에서Dev

GNOME Classic의 GNOME 터미널 투명성 (효과 없음)

분류에서Dev

QSqlTableModel 필터 결과 없음

분류에서Dev

CSS 흐릿한 유리 효과 필터가 작동하지 않음

분류에서Dev

Grunt 명령이 효과가 없음 : 출력 없음 오류 없음

분류에서Dev

updateOnDuplicate 효과 없음

분류에서Dev

SQLAlchemy : 'in_'에 대한 필터가 효과가 없습니다.

분류에서Dev

recycleview 터치 이벤트에 대한 파급 효과 없음

분류에서Dev

svg 밝기 / 투명도 효과 및 필터 (Java Android)

분류에서Dev

0 개의 결과를 반환하는 필터링 된 데이터의 각 루프에 대해 오류 없음

분류에서Dev

데이터가 유효하지 않아 게시물을 만들 수 없습니다-(양식 필드에 과거 시간을 설정했을 때)

분류에서Dev

NxM 차원의 영상에 저역 통과 필터 (AxB)를 적용하는 과정에서 계산 없음

분류에서Dev

보기를 선택하지 않고 제외 필터를 만드는 효과

분류에서Dev

UIPushEffect에 원하는 "위로 긋기"효과가 없음

분류에서Dev

uibutton을 두드려도 하이라이트 효과 없음

분류에서Dev

다중 효과없는 ImageView 터치 / 클릭 효과 (Android)

분류에서Dev

setBackButtonBackgroundVerticalPositionAdjustment가 효과가 없음

분류에서Dev

passwd 성공, 효과 없음

분류에서Dev

Elasticsearch 범위 필터가 작동하지 않음 (등록 된 필터 없음)

분류에서Dev

JPA Criteria API- "필드에 없음"과 같이 선택하는 방법

분류에서Dev

R에서 데이터를 필터링하는보다 효과적인 방법

분류에서Dev

테이블 필터링에 결과 없음 메시지 추가

분류에서Dev

필드가 유효성 검사를 통과 할 때까지 "저장"을 비활성화하는 방법. <form> 태그 없음

분류에서Dev

CSS 터치 잔물결 효과, 제대로 작동하지 않음

분류에서Dev

명령 결과 필터링

분류에서Dev

게임 음향 효과 재생

분류에서Dev

PowerBI : 필터를 사용하되 전파 효과는 피하십시오

분류에서Dev

Elasticsearch 용어 필터가 결과를 반환하지 않음

Related 관련 기사

  1. 1

    각도 날짜 필터 효과 없음

  2. 2

    GNOME Classic의 GNOME 터미널 투명성 (효과 없음)

  3. 3

    GNOME Classic의 GNOME 터미널 투명성 (효과 없음)

  4. 4

    QSqlTableModel 필터 결과 없음

  5. 5

    CSS 흐릿한 유리 효과 필터가 작동하지 않음

  6. 6

    Grunt 명령이 효과가 없음 : 출력 없음 오류 없음

  7. 7

    updateOnDuplicate 효과 없음

  8. 8

    SQLAlchemy : 'in_'에 대한 필터가 효과가 없습니다.

  9. 9

    recycleview 터치 이벤트에 대한 파급 효과 없음

  10. 10

    svg 밝기 / 투명도 효과 및 필터 (Java Android)

  11. 11

    0 개의 결과를 반환하는 필터링 된 데이터의 각 루프에 대해 오류 없음

  12. 12

    데이터가 유효하지 않아 게시물을 만들 수 없습니다-(양식 필드에 과거 시간을 설정했을 때)

  13. 13

    NxM 차원의 영상에 저역 통과 필터 (AxB)를 적용하는 과정에서 계산 없음

  14. 14

    보기를 선택하지 않고 제외 필터를 만드는 효과

  15. 15

    UIPushEffect에 원하는 "위로 긋기"효과가 없음

  16. 16

    uibutton을 두드려도 하이라이트 효과 없음

  17. 17

    다중 효과없는 ImageView 터치 / 클릭 효과 (Android)

  18. 18

    setBackButtonBackgroundVerticalPositionAdjustment가 효과가 없음

  19. 19

    passwd 성공, 효과 없음

  20. 20

    Elasticsearch 범위 필터가 작동하지 않음 (등록 된 필터 없음)

  21. 21

    JPA Criteria API- "필드에 없음"과 같이 선택하는 방법

  22. 22

    R에서 데이터를 필터링하는보다 효과적인 방법

  23. 23

    테이블 필터링에 결과 없음 메시지 추가

  24. 24

    필드가 유효성 검사를 통과 할 때까지 "저장"을 비활성화하는 방법. <form> 태그 없음

  25. 25

    CSS 터치 잔물결 효과, 제대로 작동하지 않음

  26. 26

    명령 결과 필터링

  27. 27

    게임 음향 효과 재생

  28. 28

    PowerBI : 필터를 사용하되 전파 효과는 피하십시오

  29. 29

    Elasticsearch 용어 필터가 결과를 반환하지 않음

뜨겁다태그

보관