>  기사  >  백엔드 개발  >  Ruby로 구현된 이미지 필터 알고리즘 코드

Ruby로 구현된 이미지 필터 알고리즘 코드

小云云
小云云원래의
2017-12-05 14:38:251672검색

필터는 이제 우리 생활에서 널리 사용되고 있으며 개발 과정에서도 필터를 다룰 것입니다. 이 기사에서는 그레이스케일, 바이너리, 네거티브 및 릴리프를 포함하여 Ruby를 사용하여 구현된 여러 이미지 필터 알고리즘을 공유합니다. 매우 간단하고 실용적이므로 도움이 필요한 친구들이 참고할 수 있습니다.

원본 이미지


1. 그레이 스케일 알고리즘

컬러 사진의 각 픽셀의 색상 값은 빨간색, 녹색, 파란색의 혼합 값입니다. , 따라서 픽셀의 색상 값도 많은 색상 값을 가질 수 있습니다. 이는 컬러 사진의 원리이지만 회색조 사진은 3개의 RGB 채널 값을 설정하는 것입니다. 그림의 색상 값이 동일해집니다. 이미지가 회색으로 나타납니다.

회색조 처리에는 일반적으로 세 가지 알고리즘이 있습니다.

  1. 최대 방법: 즉, 새로운 색상 값 R=G=B=Max(R, G, B) 이 방법으로 처리된 사진은 밝기가 편향되어 보입니다. . 높은.

  2. 평균 방법: 즉, 새로운 색상 값 R=G=B=(R+G+B)/3, 이렇게 처리된 사진은 매우 부드럽습니다.

  3. 가중 평균 방법: 즉, 새로운 색상 값 R=G=B = (R * Wr + G * Wg + B * Wb) 일반적으로 사람의 눈은 색상에 따라 민감도가 다르기 때문에 일반적으로 녹색은 세 가지 색상 값의 가중치가 다릅니다. 가장 높은 값은 빨간색이고 두 번째는 파란색이고 가장 낮은 값은 Wr = 30%, Wg = 59%, Wb = 11%입니다.

다음은 Ruby의 구현입니다. 가중 평균 방법:


 #灰度化图片
 #取RGB三色平均值
 def self.grey(bmp)
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    grey = rgb.r.to_f * 0.3+rgb.g.to_f *0.59 +rgb.b.to_f * 0.11.to_i
    bmp.setRGB(i, j, RGB.new(grey, grey, grey))
   end
  end
 end

회색조 효과:


2. 이진화

이미지 이진화는 이미지 픽셀의 회색 값을 0 또는 255로 설정하는 것입니다. 전체 이미지는 명백한 흑백 효과를 나타냅니다. 계조가 임계값보다 크거나 같은 모든 픽셀은 특정 객체에 속하는 것으로 판단되며 그 계조 값은 255입니다. 그렇지 않은 경우 해당 픽셀은 객체 영역에서 제외되고 계조 값은 0입니다. 예외적인 개체 영역.

이미지 이진화는 인증 코드 크래킹과 같은 이미지 인식 응용 프로그램에서 자주 사용됩니다.

#二值化图片
 #小于一定阈值设为0 0 0,大于设置为255 255 255
 def self.binarization(bmp)
  imageGreyLevel = bmp.getGreyLevel
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    if rgb.getGreyLevel<imageGreyLevel
     bmp.setRGB(i, j, RGB.new(0, 0, 0))
    else
     bmp.setRGB(i, j, RGB.new(255, 255, 255))
    end
   end

  end
 end

이진화 효과


3. 부정적

부정적 효과의 실현은 매우 간단합니다. 각 RGB 채널의 값을 반전시키려면 255를 사용하여

#底片化图片
 #RGB取反色255-
 def self.contraryColor(bmp)
  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    rgb = bmp.getRGB(i, j)
    bmp.setRGB(i, j, rgb.getContrary)
   end
  end
 end

부정 효과


릴리프 효과

현재의 RGB 값을 사용합니다. 빼려는 점 인접한 점의 RGB 값을 제거하고 새 RGB 값으로 128을 추가합니다. 사진에서 인접한 점의 색상 값이 상대적으로 가깝기 때문에 이러한 알고리즘 처리 후에는 색상의 가장자리 영역, 즉 인접한 색상 차이가 큰 부분의 결과가 더 뚜렷해지며 다른 부드러운 부분은 더 뚜렷해집니다. 영역은 모두 동일한 색상 값을 가지지 않으며 모두 약 128에 가까워서 회색이므로
릴리프 효과가 있습니다.

실제 효과에서는 이 처리 후에도 일부 영역에 여전히 "색상" 점이나 줄무늬가 있을 수 있으므로 새 RGB 값에 대해 회색조 처리를 수행하는 것이 가장 좋습니다.

#浮雕效果
 #浮雕的算法相对复杂一些,用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,
 #因此这样的算法 处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,
 #也就是灰色,这样就具有了浮雕效果。
 #在实际的效果中,这样处理后,有些区域可能还是会有”彩色”的一些点或者条状痕迹,所以最好再对新的RGB值做一个灰度处理。
 def self.emboss(bmp)

  preRGB=RGB.new(128, 128, 128)

  for i in 0 .. bmp.height - 1
   for j in 0 .. bmp.width - 1
    currentRGB=bmp.getRGB(i, j)
    r=(currentRGB.r-preRGB.r)*1+128
    g=(currentRGB.g - preRGB.g)*1+128
    b=(currentRGB.b-preRGB.b)*1+128

    bmp.setRGB(i, j, RGB.new(r,g,b).getGreyRGB)
    preRGB = currentRGB
   end
  end

 end

엠보싱 효과


위 내용은 Ruby에서 구현한 이미지 필터 알고리즘 코드에 대한 내용입니다.

관련 추천:

CSS 필터의 자세한 소개에 대해 이야기해 보세요

CSS3 필터 효과 구현의 자세한 예

이미지 필터 효과 구현을 위한 HTML5 샘플 코드 공유

위 내용은 Ruby로 구현된 이미지 필터 알고리즘 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.